Javascript 使用JSON.parse reviver强制结果对象中未定义的值,而不是忽略属性
parse将序列化的JSON作为参数并对其进行反序列化。第二个(可选)参数是一个reviver函数,它接受一个键和值,并返回反序列化对象中的替换值。有文档记录的行为是,如果恢复程序返回undefined或nothing,则将从结果反序列化对象中删除相关属性 在这种情况下,我希望所讨论的属性包含在结果的反序列化对象中,其值为undefined 因此,例如,以下情况目前是正确的:Javascript 使用JSON.parse reviver强制结果对象中未定义的值,而不是忽略属性,javascript,json,deserialization,json-deserialization,Javascript,Json,Deserialization,Json Deserialization,parse将序列化的JSON作为参数并对其进行反序列化。第二个(可选)参数是一个reviver函数,它接受一个键和值,并返回反序列化对象中的替换值。有文档记录的行为是,如果恢复程序返回undefined或nothing,则将从结果反序列化对象中删除相关属性 在这种情况下,我希望所讨论的属性包含在结果的反序列化对象中,其值为undefined 因此,例如,以下情况目前是正确的: JSON.parse(JSON.stringify({a: 1, b:2}), (k, v) => v===2 ?
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}
有没有办法写出复兴者来做这件事
我特别不想在反序列化之后再次遍历对象,因此请不要建议将其作为解决方案。另外,我特别不希望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
]
}
}
我怀疑用一个简单的恢复程序和
JSON.parse
能做到这一点
我不知道这是否能满足您的约束条件,这就像sin一样难看,但这里有一种方法:将JSON.parse
包装到存储您的恢复程序中的未定义的
键的东西中,并将它们添加回末尾。这并不需要再次迭代对象(您明确拒绝了该对象),但它会迭代未定义的
键列表:
constmyparse=(对象,恢复程序)=>{
如果(复兴者的类型!==‘功能’){
返回JSON.parse(obj)
}
常量undefs=[]
常数修正=(k,v)=>{
const val=还原剂(k,v)
if(typeof val==‘未定义’){
未定义推送(k)
}
返回val;
}
const ret=JSON.parse(obj,rev)
forEach(k=>ret[k]=未定义)
回程网
}
const result=myParse(
stringify({a:1,b:2}),
(k,v)=>v==2?未定义:v
)
console.log(result)
漂亮又丑陋的尝试。现在的问题是:myParse(JSON.stringify({a:1,b:{c:1,d:2}),(k,v)=>v==2?未定义:v)这将产生{a:1,b:{c:1},d:未定义-如果我们想这样做,我们需要在恢复程序中获得密钥的完整上下文。哦,当然……我没有经常使用恢复程序,但是考虑到它们的API,我认为如果不重写JSON.parse
所做的很多事情,您就太倒霉了。有很多实现在运行,您可以参与其中uld将一个修改为以不同的方式处理未定义的
。不过,很抱歉,这听起来并不有趣。只需使用null
即可。谢谢,但我已经在问题中明确表示这不起作用。啊,我读过头了。通常不是null
就是一个未定义的属性(当访问结果为未定义时
)就足够了。