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

标签 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

不确定我是否需要通过“展开”功能才能获得我想要的东西,但这就是我认为我可能需要的,似乎更容易从那里“剪切”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);
}

Here it is

但是我必须警告您,此代码具有 O(n^3) 的渐进性,这意味着当 n 大于 100 时,您不应该使用它。它可以优化为线性解。

关于Javascript:跳过多维数组中的多个级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36793652/

相关文章:

php - Mysql - 如何选择行在数组中的列?

recursion - 哪些语言没有循环结构?

c++ - C++中的递归函数

Python-获取树中所有 child 的高度

javascript - js中的变量在执行前都是转化为对象吗?

javascript - 通过ajax post发送文件和表单数据

javascript - Meteor Facebook Messenger Bot webhook

javascript - 使用 date-fns 将日期解析为 UTC 的正确方法

arrays - Perl - 分割数组并循环其子数组

arrays - 如何在 Swift 2 中使结构成为可订阅的?