Javascript JSON.stringify()无法按预期工作
我已经多次使用了Javascript JSON.stringify()无法按预期工作,javascript,json,stringify,Javascript,Json,Stringify,我已经多次使用了JSON.stringify(),并注意到一些问题,如(中所述): 周期 太深的物体 数组太长 但是,我在对象上面临不正确的stringify操作,如下所示: 在控制台上运行JSON.stringify(obj)之后,我得到了这个结果 "[{"$$hashKey":"object:103", "ProductCategories": [{"Id":2,"ShopProductCategoryName":"Drink","isSelected":true}
JSON.stringify()
,并注意到一些问题,如(中所述):
- 周期
- 太深的物体
- 数组太长
"[{"$$hashKey":"object:103",
"ProductCategories": [{"Id":2,"ShopProductCategoryName":"Drink","isSelected":true}
{"Id":3,"ShopProductCategoryName":"Food","isSelected":true}]
}]"
它只对ProductCategories
和$$hashKey
进行字符串化,这完全出乎意料
解决尝试 如果我从
obj
创建新对象并将其字符串化,则返回正确的JSON
var newObj = { // Creates new object with same properties.
AllProductCategories: obj.AllProductCategories,
Id: obj.Id,
LabelName: obj.LabelName,
Percentages: obj.Percentages,
ProductCategories: obj.ProductCategories
}
JSON.stringify(newObj); // Returns correct JSON.
我使用该代码强制将对象发送到web api,但这种方式当然不是我想要的
在我看来
- 没有周期
- 它不太深。(只有深度3)
因此,我无法找出问题所在 我建议您创建一个函数来克隆对象,而不使用angular设置的
$$hashKey
属性,我想:
function cloneObj (obj) {
var cloned = JSON.parse(JSON.stringify(obj));
delete cloned.$$hashKey;
for(var key in cloned) {
if(typeof cloned[key] === 'object') {
cloned[key] = cloneObj(cloned[key]);
}
}
return cloned;
}
克隆对象而不使用
$$hashKey
后,可以毫无问题地对其进行字符串化。请注意,console.log是异步的,而JSON.stringify是同步的。当您调用stringify时,您确定屏幕截图上显示的属性(看起来是从控制台显示的)已经存在吗?如果没有看到复制问题的代码,我们最好是瞎猜。它是真实属性还是从原型继承的?JSON.stringify忽略prototype,而console.log显示所有可枚举属性。@Juhana有很多代码可以形成这样的对象,只有JSON有问题。stringify(obj)
@doldtconsole.log
不一定是异步的,请参阅Angular自带的,去掉了$$properties。没有理由手动删除它们。