首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在重复嵌套数组中查找对象和父对象

在重复嵌套数组中查找对象和父对象
EN

Stack Overflow用户
提问于 2018-07-09 09:27:00
回答 3查看 76关注 0票数 1

如何在未知大小的重复嵌套数组中找到对象和父对象?使用存档或本机javascript。

数组可能如下所示:

代码语言:javascript
复制
var modules = [{
    name: 'Module1',
    submodules: [{
        name: 'Submodule1',
        id: 1,
        submodules: [{
          name: 'Submodule11',
          id: 1,
          submodules: []
        }, {
          name: 'Submodule12',
          id: 2,
          submodules: [{
            name: 'Submodule121',
            id: 1,
            submodules: []
          }, {
            name: 'Submodule122',
            id: 2,
            submodules: []
          }]
        }]
      },
      {
        name: 'Submodule2',
        id: 2,
        submodules: []
      }
    ]
  },
  {
    name: 'Module2',
    submodules: [{
      name: 'Submodule1',
      id: 3,
      submodules: []
    }, {
      name: 'Submodule2',
      id: 4,
      submodules: []
    }]
  }
];

假设是,数组中的所有'name‘属性都是唯一的

我想找出:

name: 'Submodule122'

我使用这个函数来查找父对象,但它只在第一级数组上工作:

代码语言:javascript
复制
_.find(this.modules , function(item) {
            return _.some(item.submodules, { name: 'Submodule122'});

这可以找到实际的对象,但是它也只能在数组的第一级工作:

代码语言:javascript
复制
_(this.modules)
            .thru(function (coll) {
                return _.union(coll, _.map(coll, 'submodules'));
            })
            .flatten()
            .find({ name: 'Submodule122'})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-09 09:42:11

通过将实际对象保持为父对象,您可以采取迭代和递归的方法。

代码语言:javascript
复制
function find(name, array, parent) {
    var result;
    array.some(object =>
        object.name === name && (result = { object, parent }) || 
        (result = find(name, object.submodules, object))
    );
    return result;
}

var modules = [{ name: 'Module1', submodules: [{ name: 'Submodule1', id: 1, submodules: [{ name: 'Submodule11', id: 1, submodules: [] }, { name: 'Submodule12', id: 2, submodules: [{ name: 'Submodule121', id: 1, submodules: [] }, { name: 'Submodule122', id: 2, submodules: [] }] }, { name: 'Submodule2', id: 2, submodules: [] }] }, { name: 'Module2', submodules: [{ name: 'Submodule1', id: 3, submodules: [] }, { name: 'Submodule2', id: 4, submodules: [] }] }] }];

console.log(find('Submodule122', modules));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 2
EN

Stack Overflow用户

发布于 2018-07-09 09:56:52

代码语言:javascript
复制
var modules = [{
    name: 'Module1',
    submodules: [{
        name: 'Submodule1',
        id: 1,
        submodules: [{
          name: 'Submodule11',
          id: 1,
          submodules: []
        }, {
          name: 'Submodule12',
          id: 2,
          submodules: [{
            name: 'Submodule121',
            id: 1,
            submodules: []
          }, {
            name: 'Submodule122',
            id: 2,
            submodules: []
          }]
        }]
      },
      {
        name: 'Submodule2',
        id: 2,
        submodules: []
      }
    ]
  },
  {
    name: 'Module2',
    submodules: [{
      name: 'Submodule1',
      id: 3,
      submodules: []
    }, {
      name: 'Submodule2',
      id: 4,
      submodules: []
    }]
  }
];

var findByName = (name, module, parent, item) => {
  parent.push(...module.filter(x => Array.isArray(x.submodules) && x.submodules.some(y => y.name == name)));
  item.push(...module.filter(y => y.name == name));

  module.forEach(x => {
    if (Array.isArray(x.submodules) && x.submodules.length > 0) {
      findByName(name, x.submodules, parent, item);
    }
  });

}

var parents = [], items = [];
findByName('Submodule12', modules, parents, items);
console.log(parents);
console.log(items);

票数 0
EN

Stack Overflow用户

发布于 2020-10-25 16:45:55

不完全是什么要求,但我认为仍然值得分享。我们现在将目标扫描用于所有数据处理任务,一旦您对它进行了处理,它就会非常强大。以下是你回答问题的方法

请注意,这将返回所有的父母,但选择您想要的家长是非常容易的。

代码语言:javascript
复制
// const objectScan = require('object-scan');

const search = (name, data) => objectScan(['**.name'], {
  rtn: 'parents',
  abort: true,
  filterFn: ({ value }) => value === name
})(data);

const modules = [{ name: 'Module1', submodules: [{ name: 'Submodule1', id: 1, submodules: [{ name: 'Submodule11', id: 1, submodules: [] }, { name: 'Submodule12', id: 2, submodules: [{ name: 'Submodule121', id: 1, submodules: [] }, { name: 'Submodule122', id: 2, submodules: [] }] }] }, { name: 'Submodule2', id: 2, submodules: [] }] }, { name: 'Module2', submodules: [{ name: 'Submodule1', id: 3, submodules: [] }, { name: 'Submodule2', id: 4, submodules: [] }] }];

console.log(search('Submodule122', modules));
/* =>
[ { name: 'Submodule122', id: 2, submodules: [] },
  [ { name: 'Submodule121', id: 1, submodules: [] },
    { name: 'Submodule122', id: 2, submodules: [] } ],
  { name: 'Submodule12',
    id: 2,
    submodules:
     [ { name: 'Submodule121', id: 1, submodules: [] },
       { name: 'Submodule122', id: 2, submodules: [] } ] },
  [ { name: 'Submodule11', id: 1, submodules: [] },
    { name: 'Submodule12',
      id: 2,
      submodules:
       [ { name: 'Submodule121', id: 1, submodules: [] },
         { name: 'Submodule122', id: 2, submodules: [] } ] } ],
  { name: 'Submodule1',
    id: 1,
    submodules:
     [ { name: 'Submodule11', id: 1, submodules: [] },
       { name: 'Submodule12',
         id: 2,
         submodules:
          [ { name: 'Submodule121', id: 1, submodules: [] },
            { name: 'Submodule122', id: 2, submodules: [] } ] } ] },
  [ { name: 'Submodule1',
      id: 1,
      submodules:
       [ { name: 'Submodule11', id: 1, submodules: [] },
         { name: 'Submodule12',
           id: 2,
           submodules:
            [ { name: 'Submodule121', id: 1, submodules: [] },
              { name: 'Submodule122', id: 2, submodules: [] } ] } ] },
    { name: 'Submodule2', id: 2, submodules: [] } ],
  { name: 'Module1',
    submodules:
     [ { name: 'Submodule1',
         id: 1,
         submodules:
          [ { name: 'Submodule11', id: 1, submodules: [] },
            { name: 'Submodule12',
              id: 2,
              submodules:
               [ { name: 'Submodule121', id: 1, submodules: [] },
                 { name: 'Submodule122', id: 2, submodules: [] } ] } ] },
       { name: 'Submodule2', id: 2, submodules: [] } ] },
  [ { name: 'Module1',
      submodules:
       [ { name: 'Submodule1',
           id: 1,
           submodules:
            [ { name: 'Submodule11', id: 1, submodules: [] },
              { name: 'Submodule12',
                id: 2,
                submodules:
                 [ { name: 'Submodule121', id: 1, submodules: [] },
                   { name: 'Submodule122', id: 2, submodules: [] } ] } ] },
         { name: 'Submodule2', id: 2, submodules: [] } ] },
    { name: 'Module2',
      submodules:
       [ { name: 'Submodule1', id: 3, submodules: [] },
         { name: 'Submodule2', id: 4, submodules: [] } ] } ] ]
 */

console.log(search('unknown', modules));
// => undefined
代码语言:javascript
复制
.as-console-wrapper {max-height: 100% !important; top: 0}
代码语言:javascript
复制
<script src="https://bundle.run/object-scan@13.8.0"></script>

免责声明:我是目标扫描的作者

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

https://stackoverflow.com/questions/51242207

复制
相关文章

相似问题

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