递归迭代嵌套对象以更改所有出现的键值
Recursively iterate over a nested object to change a key value on all occurrences
有一个输入结构,其规则嵌套在其他规则中。在规则数组中,只要有'data' 属性,它的值就得改成"foo"
示例输入对象:
{条件:'and',规则:[{data:'123'}]}
{条件:'or',规则:[{数据:'123'},{条件:'and',规则:[{数据:'123'}, { 数据:'456'}] }]
我正在递归调用函数进行迭代,如果项目有数据 属性,则更改其值
我的函数:
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;
}
您提到的代码中可能存在错误。
- 在对
iterateRules
的递归调用中,您传递的是 input
而不是 item
- 您还需要检查
input
是否有 rules
属性
试试这个 -
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", rules: [ { data: "123"}, {condition: "and", rules: [{data:"456"}, {condition: "and", rules: [{value: "456"}]} ] } ]}
function test (obj) {
if(!Object.keys(obj).includes('rules')) return;
obj.rules.forEach(x => x.data ? x.data = 'foo' : x);
return test(obj.rules.find(x => !Object.keys(x).includes('data')));
}
test(input)
console.log(input);
注意:此函数更改输入对象。
有一个输入结构,其规则嵌套在其他规则中。在规则数组中,只要有'data' 属性,它的值就得改成"foo"
示例输入对象:
{条件:'and',规则:[{data:'123'}]}
{条件:'or',规则:[{数据:'123'},{条件:'and',规则:[{数据:'123'}, { 数据:'456'}] }]
我正在递归调用函数进行迭代,如果项目有数据 属性,则更改其值
我的函数:
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;
}
您提到的代码中可能存在错误。
- 在对
iterateRules
的递归调用中,您传递的是input
而不是item
- 您还需要检查
input
是否有rules
属性
试试这个 -
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", rules: [ { data: "123"}, {condition: "and", rules: [{data:"456"}, {condition: "and", rules: [{value: "456"}]} ] } ]}
function test (obj) {
if(!Object.keys(obj).includes('rules')) return;
obj.rules.forEach(x => x.data ? x.data = 'foo' : x);
return test(obj.rules.find(x => !Object.keys(x).includes('data')));
}
test(input)
console.log(input);
注意:此函数更改输入对象。