如何在未知大小的重复嵌套数组中找到对象和父对象?使用存档或本机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'
我使用这个函数来查找父对象,但它只在第一级数组上工作:
_.find(this.modules , function(item) {
return _.some(item.submodules, { name: 'Submodule122'});这可以找到实际的对象,但是它也只能在数组的第一级工作:
_(this.modules)
.thru(function (coll) {
return _.union(coll, _.map(coll, 'submodules'));
})
.flatten()
.find({ name: 'Submodule122'})发布于 2018-07-09 09:42:11
通过将实际对象保持为父对象,您可以采取迭代和递归的方法。
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));.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2018-07-09 09:56:52
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);
发布于 2020-10-25 16:45:55
不完全是什么要求,但我认为仍然值得分享。我们现在将目标扫描用于所有数据处理任务,一旦您对它进行了处理,它就会非常强大。以下是你回答问题的方法
请注意,这将返回所有的父母,但选择您想要的家长是非常容易的。
// 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.as-console-wrapper {max-height: 100% !important; top: 0}<script src="https://bundle.run/object-scan@13.8.0"></script>
免责声明:我是目标扫描的作者
https://stackoverflow.com/questions/51242207
复制相似问题