【问题标题】:Javascript: skip multiple levels in multi-dimensional arrayJavascript:在多维数组中跳过多个级别
【发布时间】:2016-04-22 12:17:34
【问题描述】:

我有一个数组,其中包含一个对象的平面列表,每个对象都有一个父属性、一个 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 级。我的目标是使用一个函数,在其中我提供数组和要跳过的级别数。

【问题讨论】:

  • 您好!在之前/之后有一个例子会更清楚。
  • 我在 plnkr.co 链接中的数组,我想做这样的:

标签: javascript arrays recursion lodash


【解决方案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 时使用它。它可以优化为线性解。

【讨论】:

  • Pitchperfekt,非常感谢!哇,这对于 n > 100 来说已经绰绰有余了;),我需要一个包含 10-20 个项目的数组。知道是否可以使用 lodash 稍微瘦身吗?
  • 确实令人印象深刻。做得很好 - 谢谢,就像我希望的那样工作。
  • 对这种情况有特殊的操作。你可以接受答案;)
猜你喜欢
  • 2014-03-01
  • 2021-10-21
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2018-10-20
  • 2015-10-15
相关资源
最近更新 更多