Javascript:跳过多维数组中的多个级别
我有一个数组,包含一个对象的平面列表,每个对象都有一个父属性、一个id和其他一些东西。我可以用它来建立一个树形结构。我想做的是实际接收某个级别的项目:Javascript:跳过多维数组中的多个级别,javascript,arrays,recursion,lodash,Javascript,Arrays,Recursion,Lodash,我有一个数组,包含一个对象的平面列表,每个对象都有一个父属性、一个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保留在一个(平面)对
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构建一个树结构:
我甚至不确定我是否需要通过“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;
});
}
是在JSFIDLE中进行测试的代码
或者,如果你不在乎可读性,只在乎苗条
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时使用它。它可以优化为线性解决方案。您好!在plnkr.co链接中有一个数组,我想做一个类似这样的东西:Pitchperfekt,非常感谢!哇,如果n>100,那就足够了;),我需要一个10-20个项目的数组。你知道是否可以用lodash来瘦身吗?确实令人印象深刻。做得很好-谢谢,就像我希望的那样。对于这种情况有一个特别的行动。你可以接受答案;)