在数组和嵌套子数组中搜索Lodash属性
lodash property search in array and in nested child arrays
我有这样一个数组:
[
{
id: 1,
name: 'test 1',
children: []
},
{
id: 2,
name: 'test 2',
children: [
{
id: 4,
name: 'test 4'
}
]
},
{
id: 3,
name: 'test 3',
children: []
}
]
我如何在这个数组和嵌套的children
数组中过滤id
属性?
例如,搜索id = 3
,应该返回test 3
对象,搜索id = 4
,应该返回test 4
对象。
使用lodash,您可以这样做:
_(data)
.thru(function(coll) {
return _.union(coll, _.map(coll, 'children') || []);
})
.flatten()
.find({ id: 4 });
这里,thru()用于初始化包装后的值。它返回原始数组的并集,以及嵌套的子数组。然后使用flatten()对该数组结构进行扁平化,因此您可以找到()项。
这是一个非常简单的树遍历任务。解决这个问题最简单的方法是递归(链接到jsbin)。它可以在任何深度下工作(当然有递归限制),并且它是复杂度最低的最快方法之一O(n):
function find(id, items) {
var i = 0, found;
for (; i < items.length; i++) {
if (items[i].id === id) {
return items[i];
} else if (_.isArray(items[i].children)) {
found = find(id, items[i].children);
if (found) {
return found;
}
}
}
}
更新:
查找所有匹配项—一个稍微修改的函数(上面的jsbin链接已更新):
function findAll(id, items) {
var i = 0, found, result = [];
for (; i < items.length; i++) {
if (items[i].id === id) {
result.push(items[i]);
} else if (_.isArray(items[i].children)) {
found = findAll(id, items[i].children);
if (found.length) {
result = result.concat(found);
}
}
}
return result;
}
另一个lodash
选项,带有子键和无限深度。
const flattenItems = (items, key) => {
return items.reduce((flattenedItems, item) => {
flattenedItems.push(item)
if (Array.isArray(item[key])) {
flattenedItems = flattenedItems.concat(flattenItems(item[key], key))
}
return flattenedItems
}, [])
}
const item = find(flattenItems(items, 'children'), ['id', 4])
你可以通过使用ES6语法的纯javascript来实现这一点:
- 首先你可以使用
.reduce
函数 平整化数组 - 然后你可以使用
.find
搜索你想要找到的id
const arr = [
{
id: 1,
name: 'test 1',
children: []
},
{
id: 2,
name: 'test 2',
children: [
{
id: 4,
name: 'test 4'
}
]
},
{
id: 3,
name: 'test 3',
children: []
}
]
const flattenData = arr.reduce((newArr, arr) => {
const {children, ...rest } = arr;
newArr.push(rest);
return newArr.concat(children)
}, [])
console.log(flattenData.find(d=>d.id===4))
相关文章:
- 使用javascript搜索具有用户输入的数组
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 使用数组向下搜索Javascript对象
- 具有嵌套对象数组的 Javascript 对象的递归搜索函数
- jQuery-在数组中搜索类似的元素
- Javascript:使用用户输入搜索数组
- findAndModify,如何对文档进行操作's数组搜索对象并更改字段值
- 在记录数组搜索后追加变量和数组项
- 按第一个字符进行数组搜索
- 更高效的数组搜索
- Javascript数组搜索并删除字符串
- JavaScript中的二进制数组搜索
- 在JavaScript中有更好的方法吗?使用while进行数组搜索
- Javascript中的数组搜索不工作
- 如何用输入数组搜索对象
- 这是更有效的JavaScript数组搜索或MySQL LIKE查询
- Javascript或PHP数组搜索像SQL % search %
- Js数组搜索功能,适用于ie8
- 从Python到Javascript的2D数组搜索
- Javascript数组搜索