查找json nodejs中是否存在路径

时间:2016-06-27 11:36:24

标签: javascript json node.js

我想在现有的json中添加以下路径中的新值:   

VAL:"BS",路径:["info", "bosses", "lives"]

如果我的json有传递它将添加值,否则我将创建字段

示例:

var myJson = {
    "root": {
        "name": "jim",
        "age": "4",
        "info": {"bosses": {"name": "sam"}}
    }
}

所以我的新json会是这样的:

 var myNewJson = {
    "root": {
        "name": "jim",
        "age": "4",
        "info": {"bosses": {"name": "sam", "lives": "BS"}}
    }
}

我没有这些字段的例子:

var myJson = {
        "root": {
            "name": "jim",
            "age": "4",
        }
    }

输出:

var myNewJson = {
        "root": {
            "name": "jim",
            "age": "4",
            "info": {"bosses": {"lives": "BS"}}
        }
    }

路径的一部分存在的例子我没有字段:

var myJson = {
        "root": {
            "name": "jim",
            "age": "4",
          "info": {"salary": 500}
        }
    }

输出:

var myNewJson = {
        "root": {
            "name": "jim",
            "age": "4",
            "info": {"salary": 500, "bosses": {"lives": "BS"}}
        }
    }

如何检查路径是否存在(注意:路径的一部分可能存在 - 我怎么知道从哪里开始呢?)

2 个答案:

答案 0 :(得分:1)

这是旧的,但是... 使用 optional chaining 测试路径上字​​段的存在性现在更好,例如: var infoExists = !!myJson?.root?.info - ?. 表示如果缺少 root,则该行不会中断。

不过,在这种情况下,我不会担心测试字段是否存在,我会使用扩展运算符来重建 info 对象:

var newInfo = {"bosses": {"lives": "BS"}};
var info = {...myJson.root.info, ...newInfo};

如果 myJson.root.info 不存在,没问题(只要 myJson.root 存在,提示一个可选的链接检查?),我们只得到 newInfo

如果 myJson.root.info 当前持有 {"salary": 500},点差运算符会将其合并为 "info":{"salary": 500, "lives": "BS"}

如果 myJson.root.info 当前与 newInfo 相同,好吧,不用担心,我们最终没有变化。

现在您拥有完全如您所愿的信息对象,您可以简单地将原始对象中的它替换为 myJson.root.info = ...info;

答案 1 :(得分:0)

你可以认为它的第一件事可能是一些代码:

if (myObject.attributeName){
    //property exists!
}

它会在许多测试中为你工作,但我相信你知道javascript管理一些值为truthy或falsy。它在许多比较中使用不同类型值的批次作为布尔值假(只是===不转换类型)。 当你检查某事时

if(somethingtotest){
// it's true
}

你写的是

if(somethingtotest == true){
// it's true
}

' =='运营商尝试将不同类型转换为类似的#34;一起。 在第一个示例代码中,许多对象属性值可以是' =='真正。 该属性值是真实的,这意味着它是一个对象,一个非空字符串,一个非零数字,它不是NaN,true,而不是null或undefined。 这意味着如果属性是空字符串(“”),则此检查将失败。相同的if值为0(零),null,false。在这种情况下,失败并不意味着财产不存在。事实上,该属性确实存在并包含一个值,但该值是假的,因此不通过此测试。

由于ECMAScript 5的基础对象具有函数hasOwnProperty(propertyName) 所以你可以试试

if(myObject.hasOwnPorperty('attributeName')){
// do something
}

这个函数记得我们对象也有我们的对象可以继承的原型属性。例如,如果我写

myObject.anyAttribute='AnyValue';
var my1stObject = Object.create(myObject);
var my2ndObject = Object.create(myObject);
myObject.anyAttribute='AnotherValue';
console.log(my1stObject.anyAttribute);
console.log(my2ndObject.anyAttribute);

最后两行将打印' AnotherAttribute'。 在这种情况下,第一个和第二个对象没有属性anyAttribute但它们将使用prototipe one。 如果你写的话会有所不同

myObject.anyAttribute='AnyValue';
var my1stObject = Object.create(myObject);
var my2ndObject = Object.create(myObject);
my1stObject.anyAttribute='AnotherValue';
console.log(my1stObject.anyAttribute); //AnotherValue
console.log(my2ndObject.anyAttribute); //AnyValue

第一个对象hasOwnProperty' anyAttribute'因为我们设定了它。

最后,为了检查属性,proptotipe或者自己是否确实存在,你想要使用

if('anyProperty' in myObject){
//do something
}

我建议你在这个链接上更好地阅读: https://www.nczonline.net/blog/2010/07/27/determining-if-an-object-property-exists/