我有一个动态的对象数组,其中有一个无限嵌套的items数组,如下所示:
var items = [{
id: '7172hsdr',
item: {},
items: []
},
{
id: '5343rtas',
item: {},
items: [{
id: '4545nrhk',
item: [],
items: [{
id: 'kbkb1212',
item: [],
items: []
}]
}]
}]我想在这个集合中搜索并找到一个id kbkb1212的对象。我更喜欢和房客一起做。
问题是有时我寻找一个id为7172hsdr的对象,有时我需要kbkb1212。
我所做的
我使用了下面搜索第一级的函数。
var item = _.find(items, { id: '7172hsdr' });它可以正常工作,但是如果我需要kbkb1212,它就不需要了。
发布于 2017-02-11 12:09:02
在普通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; }
发布于 2017-02-12 07:52:29
这不是通用的解决方案,但适用于你的情况
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]);发布于 2017-02-11 12:13:46
使用自定义递归函数的纯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'));
https://stackoverflow.com/questions/42175580
复制相似问题