Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:跳过多维数组中的多个级别_Javascript_Arrays_Recursion_Lodash - Fatal编程技术网

Javascript:跳过多维数组中的多个级别

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保留在一个(平面)对

我有一个数组,包含一个对象的平面列表,每个对象都有一个父属性、一个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构建一个树结构:


我甚至不确定我是否需要通过“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来瘦身吗?确实令人印象深刻。做得很好-谢谢,就像我希望的那样。对于这种情况有一个特别的行动。你可以接受答案;)