![](/img/trans.png)
[英]Recursively iterate over a nested object to change a key value on all occurrences (JS)
[英]Recursively iterate over a nested object to change a key value on all occurrences
有一個輸入結構,其中規則嵌套在其他規則中。 在rules數組中,只要有“data”屬性,其值必須更改為“foo”
示例輸入對象:
{condition:'和',規則:[{data:'123'}]}
{condition:'或',規則:[{data:'123'},{condition:'和',規則:[{data:'123'},{data:'456'}]}]
遞歸調用函數迭代並且如果項具有data屬性,則更改其值
我的功能:
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);
注意:此函數更改輸入obj。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.