使用lodash进行无限深度搜索

时间:2017-02-11 11:58:05

标签: javascript lodash

我有一个动态的对象数组,其中包含一个无限制的items嵌套数组,如下所示:

var items = [{
  id: '7172hsdr',
  item: {},
  items: []
},
{
  id: '5343rtas',
  item: {},
  items: [{
    id: '4545nrhk',
    item: [],
    items: [{
      id: 'kbkb1212',
      item: [],
      items: []
    }]
  }]
}]

我想在此集合中搜索并找到ID为kbkb1212的对象。我更喜欢用lodash来做。

问题是我有时会查找ID为7172hsdr的对象,有时我需要kbkb1212

我做了什么

我使用了以下搜索第一级的功能。

var item = _.find(items, { id: '7172hsdr' });

它工作正常,但如果我需要kbkb1212则没有。

3 个答案:

答案 0 :(得分:2)

在普通的Javascript中,您可以使用迭代和递归方法在嵌套数据结构中查找项目。

function find(array, id) {
    var object;

    array.some(function f(a) {
        if (a.id === id) {
            object = a;
            return true;
        }
        if (Array.isArray(a.items)) {
            return a.items.some(f);
        }
    });
    return object;
}

var items = [{ id: '7172hsdr', item: {}, items: [] }, { id: '5343rtas', item: {}, items: [{ id: '4545nrhk', item: [], items: [{ id: 'kbkb1212', item: [], items: [] }] }] }];

console.log(find(items, '7172hsdr'));
console.log(find(items, 'kbkb1212'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

这不是通用解决方案,但适用于您的情况

function deepFind(array, id) {
    return array.reduce(function(result, arrayItem) {
        if (result.length) return result;
        if (arrayItem.id === id) return result.concat([arrayItem]);

        return arrayItem.items.length ? deepFind(arrayItem.items, id) : result;
    }, [])
}


console.log('one', deepFind(items, 'kbkb1212')[0]);
console.log('two', deepFind(items, '7172hsdr')[0]);

https://jsfiddle.net/v8kpr83b/3/

答案 2 :(得分:1)

使用自定义递归函数的

Javascript解决方案:

var items = [{ id: '7172hsdr', item: {}, items: [] }, { id: '5343rtas', item: {}, items: [{ id: '4545nrhk', item: [], items: [{ id: 'kbkb1212', item: [], items: [] }] }] }];

function getObjById(items, id) {
  var i = 0, o;
  for (i = 0, len = items.length; i < len; i++) {
      o = items[i];
      if (o['id'] && o.id == id) {
          return o;
      } else if (o['items'] && Array.isArray(o.items) && o.items.length){
          return getObjById(o.items, id);
      }
  }     
}

console.log(getObjById(items, 'kbkb1212'));
console.log(getObjById(items, '7172hsdr'));