我想在现有的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"}}
}
}
如何检查路径是否存在(注意:路径的一部分可能存在 - 我怎么知道从哪里开始呢?)
答案 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/