我有一个动态的对象数组,其中包含一个无限制的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
则没有。
答案 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]);
答案 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'));