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()
,并注意到一些问题,如(中所述):

  • 周期
  • 太深的物体
  • 数组太长
但是,我在对象上面临不正确的stringify操作,如下所示:

在控制台上运行JSON.stringify(obj)之后,我得到了这个结果

"[{"$$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)
@doldt
console.log
不一定是异步的,请参阅Angular自带的,去掉了$$properties。没有理由手动删除它们。