簡體   English   中英

遞歸迭代嵌套對象以更改所有實例的鍵值

[英]Recursively iterate over a nested object to change a key value on all occurrences

有一個輸入結構,其中規則嵌套在其他規則中。 在rules數組中,只要有“data”屬性,其值必須更改為“foo”

示例輸入對象:

  1. {condition:'和',規則:[{data:'123'}]}

  2. {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;
 }

您提到的代碼中存在潛在的錯誤。

  1. 在對iterateRules的遞歸調用中,您傳遞的是input而不是item
  2. 您還需要檢查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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM