Javascript: 跳过多维数组中的多级
Javascript: skip multiple levels in multi-dimensional array
我有一个数组,包含一个对象的平面列表,其中一个和每个对象都有一个父对象 属性、一个 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" 函数来获得我想要的东西,但这就是我认为我可能需要的,似乎更容易达到 "cut" 级别 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;
});
}
Here是在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时你不应该使用它。它可以优化为线性解决方案。
我有一个数组,包含一个对象的平面列表,其中一个和每个对象都有一个父对象 属性、一个 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" 函数来获得我想要的东西,但这就是我认为我可能需要的,似乎更容易达到 "cut" 级别 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;
});
}
Here是在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时你不应该使用它。它可以优化为线性解决方案。