Рекурсивно перебирать вложенный объект, чтобы изменить значение ключа во всех случаях

Это не рекомендуемый способ решить эту ошибку, но вы можете быстро ее подавить, она выполнит эту работу. Я предпочитаю это для прототипов или демонстраций. добавьте

CheckForIllegalCrossThreadCalls = false

в конструкторе Form1().

1
задан Rk R Bairi 17 January 2019 в 18:40
поделиться

2 ответа

В указанном вами коде есть потенциальная ошибка.

  1. В рекурсивном вызове на iterateRules вы передаете input вместо item
  2. Также необходимо проверить, имеет ли input свойство rules [ 117]

Попробуйте это -

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);
  }
}
0
ответ дан Rishikesh Dhokare 17 January 2019 в 18:40
поделиться

Существует рекурсивный подход для достижения этой цели:

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

примечание: эта функция изменяет входной объект.

0
ответ дан guijob 17 January 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: