Javascript:跳过多维数组中的多个级别
Javascript: skip multiple levels in multi-dimensional array
本文关键字:Javascript 数组 更新时间:2023-09-26
我有一个数组,保存一个平面对象列表,每个对象都有一个父属性,一个id和其他一些东西。我可以用它来构建树结构。我想做的是实际上只接收某个级别的项目:
1
1.1
1.1.1
1.2
1.2.1
1.2.1.1
就像,如果arr
是我的原始数组,我可以做unflatten(arr)
使其成为树状结构,然后从那里跳过级别 1 和 2,将对象 1.1.1、1.2.1 和 1.2.1.1 留在一个(平面)对象数组中。
这就是我现在所拥有的,用lodash建立一个树结构:
http://plnkr.co/edit/eRvVegJsZ9JPYeJCVwOc?p=preview
不确定我是否需要通过"unflatten"功能,以获得我想要的东西,但这就是我认为我可能需要的,似乎更容易从那里"削减"1级和2级。我的目标是使用一个函数,在其中我提供数组和要跳过的级别数。
所以你只想把>=k
级别的所有元素都放在一个列表中?
那么下面的代码可能会帮助你
function findId(arr, id) {
return _.findIndex(arr, function(el) {
return el.id == id;
});
}
function depth(arr, idx) {
if (arr[idx] && arr[idx].parent) {
var parentId = arr[idx].parent;
var parentIdx = findId(arr, parentId);
return depth(arr, parentIdx) + 1;
} else {
return 1;
}
}
function unflattenFromLevel(arr, minLevel) {
return _.filter(arr, function(el) {
var idx = findId(arr, el.id);
return depth(arr, idx) >= minLevel;
});
}
这是在jsFiddle中进行一些测试的代码。
或者,如果您不关心可读性,而只关心纤薄
function depth(arr, idx) {
if (arr[idx] && arr[idx].parent) {
return depth(arr, _.findIndex(arr, el => el.id == arr[idx].parent)) + 1;
} else {
return 1;
}
}
function unflattenFromLevel(arr, minLevel) {
return _.filter(arr, el => depth(arr, _.findIndex(arr, el2 => el2.id == el.id)) >= minLevel);
}
在这里
但是我必须警告您,此代码具有O(n^3)
渐近,这意味着当n
大于 100 时,您不应该使用它。它可以优化为线性解决方案。
相关文章:
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 将Javascript数组发送到控制器ASP.NET MVC
- JavaScript数组包含一个值
- 将JavaScript数组传递给函数
- javascript:数组循环
- 将数据存储在javascript数组中以供进一步使用
- 在Javascript数组中查找绝对最大值
- JavaScript数组优化以提高性能
- 在javascript数组中分散数字
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- Javascript数组动态
- javascript数组元素是否知道其封闭数组
- 将 JSON 数组解析为 JavaScript 数组
- 将Transform和Instance Variable转换为对象的JavaScript数组
- 使用Web Html表单创建Javascript数组
- 从重复的javascript数组结果集中只获取一行
- 如何为Javascript数组()的使用准备PHP变量
- Javascript数组和函数
- 为DataTables aoColumnDefs创建JavaScript数组(JSON格式)