Проверить ключ в глубоко вложенном объекте в массиве - PullRequest
1 голос
/ 01 апреля 2020

У меня есть массив вложенных объектов. Я должен проверить свойство ключевого объекта и вернуть его значение. Я сделал это, используя for l oop и проверяя свойство детей существует или нет. Но я думаю, что это не оптимальный способ сделать это. какой будет самый оптимальный способ сделать это. Вот кодовый массив данных объекта. Я должен получить текст для идентификатора 121.

var abc = [
  {
    id: 1,
    text: 'One',
    children: [
      {id: 11, text: 'One One'},
      {id: 12, text: 'One two', 
       children: [ {id: 121, text: 'one two one'} ]}
    ]
  },
  {
    id: 2,
    text: 'two'
  }
];

Мой подход очень специфичен c к этой проблеме. Вот оно

for(var val of abc){

  if(val.id == 121){
    console.log('in first loop',val.text);
    break;
  }

  if(Array.isArray(val.children)){

   for(var childVal of val.children) {
       if(childVal.id == 121){
        console.log('in first child', childVal.text); 
         break;
       }
     if(Array.isArray(childVal.children)){
       for(var nextChild of childVal.children){
         if(nextChild.id == 121){
           console.log('in next child', nextChild.text); 
           break;
         }

       }

       }
   }

  }

}

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Вы можете создать рекурсивную функцию, используя for...in l oop, которая возвращает совпавший объект, а затем вы можете получить его текстовое свойство.

var abc = [{"id":1,"text":"One","children":[{"id":11,"text":"One One"},{"id":12,"text":"One two","children":[{"id":121,"text":"one two one"}]}]},{"id":2,"text":"two"}]

function getProp(data, key, value) {
  let result = null;


  for (let i in data) {
    if (typeof data[i] == 'object' && !result) {
      result = getProp(data[i], key, value)
    }

    if (i == key && data[i] == value) {
      result = data
    }
  }

  return result;
}

const result = getProp(abc, 'id', 121)
console.log(result)
1 голос
/ 01 апреля 2020

Вы можете использовать подход с коротким замыканием и вернуть результат из требуемого свойства.

const
    getValue = (object, key, id) => {
        const search = o => {
            if (!o || typeof o !== 'object') return;
            if (o.id === id) return { value: o[key] };
            var value;
            Object.values(o).some(p => value = search(p));
            return value;
        };
        return search(object)?.value;
    };

var array = [{ id: 1, text: 'One', children: [{ id: 11, text: 'One One' }, { id: 12, text: 'One two', children: [{ id: 121, text: 'one two one' }] }] }, { id: 2, text: 'two' }];

console.log(getValue(array, 'text', 121));
console.log(getValue(array, 'text', 3000));
0 голосов
/ 01 апреля 2020

Учитывая, что ваши Узлы имеют вложенные Узлы в свойстве children, с использованием рекурсии и Array.prototype.find () до найти Узел по ID :

const getNode = (a, id, c = 'children', r) => {
  const rec = a => a.find(o => o.id==id && (r=o) || c in o && rec(o[c]));
  return rec(a) && r;
};


const abc = [{id: 1, text: 'One', children: [{id: 11, text: 'One one'}, {id: 12, text: 'One two', children: [{id: 121, text: 'One two one'}]}]}, {id: 2, text: 'Two' }];
console.log( getNode(abc, 121)?.text ); // One two one
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...