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

时间:2016-04-22 12:17:34

标签: 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在(平面)对象数组中。

这就是我现在所拥有的,用lodash构建树结构:

http://plnkr.co/edit/eRvVegJsZ9JPYeJCVwOc?p=preview

不确定我是否需要通过“unflatten”功能,以获得我想要的东西,但这就是我认为我可能需要的东西,似乎更容易“削减”1级&从那里2。我的目标是使用一个函数,我提供数组和要跳过的级别数。

1 个答案:

答案 0 :(得分:1)

所以你只想在列表中包含级别>=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);
}

Here it is

但是我必须警告你,这段代码已经渐近O(n^3),这意味着当n大于100时你不应该使用它。它可以优化为线性解决方案。