检查数组中深层嵌套对象中的键

时间:2020-04-01 07:37:23

标签: javascript arrays object

我有一组嵌套对象。我必须检查关键对象的属性并返回其值。我已经完成了使用for循环并检查是否存在children属性。但是我认为这不是最佳方法。什么是最理想的方法。这是对象数据的代码数组。我必须输入ID 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'
  }
];

我的方法非常针对此问题。在这里

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 个答案:

答案 0 :(得分:2)

您可以使用for...in循环创建递归函数,该循环返回匹配的对象,然后获取其text属性。

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 :(得分:1)

您可以采取短路措施,并从通缉的财产中返回结果。

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

答案 2 :(得分:0)

假设您的节点children属性中嵌套了 Node ,请使用递归Array.prototype.find()来< strong>通过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