Javascript 递归迭代嵌套对象以更改所有出现的键值
有一个输入结构,其中的规则嵌套在其他规则中。在规则数组中,只要有“data”属性,其值就必须更改为“foo” 示例输入对象:Javascript 递归迭代嵌套对象以更改所有出现的键值,javascript,angular,recursion,lodash,iterated-function,Javascript,Angular,Recursion,Lodash,Iterated Function,有一个输入结构,其中的规则嵌套在其他规则中。在规则数组中,只要有“data”属性,其值就必须更改为“foo” 示例输入对象: {条件:'and',规则:[{data:'123'}]} {condition:'or',规则:[{data:'123'},{condition:'and',规则:[{data:'123'},{data:'456'}]}] 我递归调用函数进行迭代,如果该项具有数据属性,则更改其值 我的职能: function iterateRules(input) { input
function iterateRules(input) {
input.rules.map(function(item) {
if(_.has(item, "rules")){
this.iterateRules(item); //bug-needs extra check like accepted answer
} else if(_.has(item, “data”)){
return item.data = “foo”;
}
}, this);
return input;
}
您提到的代码中有一个潜在的bug
iterateRules
的递归调用中,您传递的是input
,而不是item
输入
是否具有规则
属性function iterateRules(input) {
if(_.has(input, "rules")) {
input.rules.map(function(item) {
if(_.has(item, "rules")){
this.iterateRules(item);
} else if (_.has(item, "data")) {
return item.data = "foo";
}
}, this);
console.log(input);
}
}
有一种递归方法可以实现这一点:
const input={condition:“and”,规则:[{data:“123”},{condition:“and”,规则:[{data:“456”},{condition:“and”,规则:[{value:“456”}]}]
功能测试(obj){
if(!Object.keys(obj).includes('rules'))返回;
forEach(x=>x.data?x.data='foo':x);
返回测试(obj.rules.find(x=>!Object.keys(x).includes('data'));
}
测试(输入)
console.log(input);
如果您的示例使用常规的直接引号,并且没有像[值:'456“]这样的语法错误,这将非常有用
另外,您需要就地更改项目还是返回新项目?@MarkMeyer我想返回整个更改过的对象。代码中的错误是,我没有返回,额外检查是否有递归调用的规则有帮助(如批准的答案)在这里传递输入而不是项是一个输入错误。但是额外的条件有帮助。并且以前没有将输入返回给此函数的调用方。