Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归迭代嵌套对象以更改所有出现的键值_Javascript_Angular_Recursion_Lodash_Iterated Function - Fatal编程技术网

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

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

有一个输入结构,其中的规则嵌套在其他规则中。在规则数组中,只要有“data”属性,其值就必须更改为“foo”

示例输入对象:

  • {条件:'and',规则:[{data:'123'}]}

  • {condition:'or',规则:[{data:'123'},{condition:'and',规则:[{data:'123'},{data:'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;
     }
    

    您提到的代码中有一个潜在的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我想返回整个更改过的对象。代码中的错误是,我没有返回,额外检查是否有递归调用的规则有帮助(如批准的答案)在这里传递输入而不是项是一个输入错误。但是额外的条件有帮助。并且以前没有将输入返回给此函数的调用方。