Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用JSON.parse reviver强制结果对象中未定义的值,而不是忽略属性_Javascript_Json_Deserialization_Json Deserialization - Fatal编程技术网

Javascript 使用JSON.parse reviver强制结果对象中未定义的值,而不是忽略属性

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 ?

parse将序列化的JSON作为参数并对其进行反序列化。第二个(可选)参数是一个reviver函数,它接受一个键和值,并返回反序列化对象中的替换值。有文档记录的行为是,如果恢复程序返回undefined或nothing,则将从结果反序列化对象中删除相关属性

在这种情况下,我希望所讨论的属性包含在结果的反序列化对象中,其值为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}
有没有办法写出复兴者来做这件事

我特别不想在反序列化之后再次遍历对象,因此请不要建议将其作为解决方案。另外,我特别不希望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
就是一个未定义的属性(当访问结果为
未定义时
)就足够了。