2

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

示例输入对象:

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

  2. {条件:'或',规则:[{数据:'123'},{条件:'和',规则:[{数据:'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;
 }
4

2 回答 2

2

您提到的代码中存在潜在的错误。

  1. 在对你的递归调用iterateRules中传递input而不是item
  2. 您还需要检查是否inputrules属性

试试这个 -

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);
  }
}
于 2019-01-17T04:16:09.763 回答
1

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

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。

于 2019-01-17T04:37:37.467 回答