我有一个这样的对象:
{
"responses": {
"firstKey": {
"items": {
"name": "test name one"
}
},
"anotherKey": {
"items": {
"name": "test name two"
}
},
"oneMoreKey": {
"items": {
"name": "John"
}
}
}
}
我需要查找所有“名称”键并仅在以“测试名称”开头时替换其值,然后返回新的JSON对象:
{
"responses": {
"firstKey": {
"items": {
"name": "N/A"
}
},
"anotherKey": {
"items": {
"name": "N/A"
}
},
"oneMoreKey": {
"items": {
"name": "John"
}
}
}
}
问题是键在对象之间是不一致的,即“ firstKey”,“ secondKey” ...我尝试了ForEach,但似乎太麻烦了...所以我需要用lodash或vanila JavaScript替换价值。
答案 0 :(得分:1)
应该迭代javascript对象,然后可以检查和替换name的每个值。可以使用诸如hasOwnProperty()
之类的检查来确保您没有迭代缺少“项目”或“名称”的对象,以更好地进行错误处理。
var data = {
"responses": {
"firstKey": {
"items": {
"name": "test name one"
}
},
"anotherKey": {
"items": {
"name": "test name two"
}
},
"oneMoreKey": {
"items": {
"name": "John"
}
}
}
};
鉴于上面的JSON,您可以使用简单的for
语句进行迭代,然后检查每个名称的值并替换。
for(var key in data.responses){
if ((data.responses[key].items.name).match(/test name/)){
data.responses[key].items.name = "N/A";
}
}
要检查替换项,可以将data
登录到控制台。
console.log(JSON.stringify(data));
答案 1 :(得分:0)
它也可以在解析过程中完成:
var json = `{
"responses": {
"firstKey": {
"items": {
"name": "test name one"
}
},
"anotherKey": {
"items": {
"name": "test name two"
}
},
"oneMoreKey": {
"items": {
"name": "John"
}
}
}
}`
var obj = JSON.parse(json, (k, v) => k == 'name' && /^test name/.test(v) ? 'N/A' : v)
console.log( obj )
答案 2 :(得分:0)
一个javascript对象在所有意图和目的上都是一棵树-尽管它可以并且可能是有向图-很有可能是循环表示图中的节点指向其自身父节点的自身。遵循一个循环可能导致永无止境的递归或循环。
您想使用类似traverse
的方式来完成您正在说的事情。它会处理所有使遍历图形变得麻烦的事情-处理图形中的循环等。
const traverse = require('traverse');
. . .
var scrubbed = traverse(obj).map( function(value) {
const isTestName = this.key === 'name'
&& value
&& /^test name/i.test(value)
;
if (isTestName) {
this.update('N/A');
}
});
注意:给travese
的回调函数不能是箭头函数(() => {...}
,因为该函数的this
上下文是{{1} }当前节点的上下文。
该traverse
上下文还使您可以访问从根到当前节点的整个路径,以及指向父节点的traverse
上下文的向上链接。
答案 3 :(得分:-2)
做这样的事情。使用正则表达式转换为字符串替换(也向正则表达式添加键),然后再转换回去。
var data = {
"responses": {
"firstKey": {
"items": {
"name": "test name one"
}
},
"anotherKey": {
"items": {
"name": "test name two"
}
},
"oneMoreKey": {
"items": {
"name": "John"
}
}
}
};
var originalMsg = JSON.stringify(data);
console.log(data)
console.log(originalMsg)
var updatedMsg = originalMsg.replace(/test name [a-z]*/g, "N/A");
console.log(updatedMsg)
var newObj = JSON.parse(updatedMsg);
console.log(newObj);