JSON.parse将序列化的Json作为参数并反序列化。第二个(可选)参数是一个reviver函数,它接受一个键和值,并在反序列化的对象中返回替换值。记录的行为是reviver,如果它返回undefined或什么都没有,那么将从生成的反序列化对象中省略所讨论的属性。
我有一种情况,我希望有问题的属性包含在生成的反序列化对象中,其值为undefined。
因此,例如,以下是正确的:
JSON.parse(JSON.stringify({a: 1, b:2}), (k, v) => v===2 ? undefined : v);
// result of this is {a:1}, as is documented/expected.
但是如果我真的希望结果是
那该怎么办?{a:1, b:undefined}
有没有办法写reviver来做这件事?
我特别不想在反序列化后再次遍历对象,所以请不要建议作为解决方案。另外,我特别不希望b被设置为null。我真的希望它作为一个值未定义的属性存在。
这可能根本不可能,但我希望有人有一个漂亮的想法!
第一次编辑:
第一个建议是很好的尝试,但我也需要它在深层结构中工作,所以:
JSON.parse(JSON.stringify({
a: 1,
b:{
c: 1,
d: 2,
e: [
1,
2,
{
f: 1,
g: 2
},
4
]
}
}), (k, v) => v===2 ? undefined : v);
应该在我理想的世界中屈服:
{
a: 1,
b:{
c: 1,
d: undefined,
e: [
1,
undefined,
{
f: 1,
g: undefined
},
4
]
}
}
答案 0 :(得分:0)
我怀疑这可以通过简单的复活和JSON.parse
完成。
我不知道这是否会满足你的约束,而且它很丑陋,但这是一种方法:将JSON.parse
包裹在存储{{1}的东西中来自你的复活节的密钥,并在最后添加它们。这不需要再次迭代您的对象,您明确拒绝了它,但它会迭代undefined
键列表:
undefined