代码之家  ›  专栏  ›  技术社区  ›  Rk R Bairi

递归迭代嵌套对象以更改所有出现的键值

  •  1
  • Rk R Bairi  · 技术社区  · 5 年前

    有一个输入结构,其中规则嵌套在其他规则中。在规则数组中,如果存在“data”属性,则必须将其值更改为“foo”

    示例输入对象:

    1. 条件:'和',规则:[数据:'123']

    2. 条件:'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;
     }
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   Rishikesh Dhokare    5 年前

    您提到的代码中有一个潜在的错误。

    1. 在递归调用中 iterateRules 你正在通过 input 而不是 item
    2. 您还需要检查 输入 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);
      }
    }
    
        2
  •  1
  •   guijob    5 年前

    实现这一点有一种递归方法:

    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);

    注:此功能改变输入对象。