首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无限制深度搜索与房客

无限制深度搜索与房客
EN

Stack Overflow用户
提问于 2017-02-11 11:58:04
回答 3查看 2K关注 0票数 2

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

代码语言:javascript
复制
var items = [{
  id: '7172hsdr',
  item: {},
  items: []
},
{
  id: '5343rtas',
  item: {},
  items: [{
    id: '4545nrhk',
    item: [],
    items: [{
      id: 'kbkb1212',
      item: [],
      items: []
    }]
  }]
}]

我想在这个集合中搜索并找到一个id kbkb1212的对象。我更喜欢和房客一起做。

问题是有时我寻找一个id为7172hsdr的对象,有时我需要kbkb1212

我所做的

我使用了下面搜索第一级的函数。

代码语言:javascript
复制
var item = _.find(items, { id: '7172hsdr' });

它可以正常工作,但是如果我需要kbkb1212,它就不需要了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-11 12:09:02

在普通Javascript中,您可以使用交互式和递归的方法来查找嵌套数据结构中的项。

代码语言: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'));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 3
EN

Stack Overflow用户

发布于 2017-02-12 07:52:29

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-02-11 12:13:46

使用自定义递归函数的纯Javascript解决方案:

代码语言: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'));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42175580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档