嵌套列表的 Javascript 长度

标签 javascript arrays

目标:给定一个混合类型的数组,确定每个级别的元素数量。如果同一层有两个子数组,则它们的每个元素都计入该层元素的总数。

方法:

Array.prototype.elementsAtLevels = function( level, levelData ) {
  if ( level == undefined ) { level = 0;  } else { level += 1 }
  if ( levelData == undefined ) { levelData = {}; }
  if ( levelData[level] == undefined ) { levelData[level] = this.length} else { levelData[level] += this.length }
  this.map(function(e, i) {if (Array.isArray(e)){ e.elementsAtLevels(level, levelData) }})
  return levelData
}

测试用例:

[
  1,      // 0: 1
  1,      // 0: 2
  1,      // 0: 3
  1,      // 0: 4
  [       // 0: 5
    2,    // 1: 1
    2,    // 1: 2
    2     // 1: 3
  ], 
  [       // 0: 6
    [     // 1: 4
      3,  // 2: 1
      3   // 2: 2
    ],   
    [     // 1: 5
      [   // 2: 3
        4 // 3: 1
      ]
    ]
  ]
].elementsAtLevels()

// Object [ 6, 5, 3, 1 ]

问题: 有没有更有效的方法来计算这个?

最佳答案

我写了一些与您所拥有的非常相似的东西,并且在非常基本的基准测试中,它的运行时间不到一半。

let a = [1,1,1,1,[2,2,2],[[3,3],[[4]]]];

Array.prototype.elementsAtLevels2 = function (level, lData) {
    if (!level || !lData) {
        level = 0;
        lData = {};
    }

    if (!(level in lData)) {
        lData[level] = this.length;
    } else {
        lData[level] += this.length;
    }
    this.forEach(function (v) {
        if (Array.isArray(v))
            v.elementsAtLevels2(level + 1, lData);
    });

    return lData;
}

console.log(a.elementsAtLevels2());

我猜测主要的性能提升可能来自 forEach vs mapmap 创建一个新数组,其中 forEach 没有。

编辑

它在 JSBin

关于嵌套列表的 Javascript 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50001658/

相关文章:

javascript - Meteor 没有在 foreach 中添加新的插件元素

javascript - 将类属性的引用传递给 addEventListener

c - 使用结构体添加两个二维数组时出现段错误 11

c++ - vector 循环无法正常运行

php - 如何在网络中实现类似谷歌地图的缩放和平移系统?

php - 我怎样才能在文本框中输入内容并同时将我输入的内容显示在 div 中?

javascript - 弹出窗口不可滚动

java - 何时使用 List<Long> 而不是 long[]?

javascript - 当数组有两个值时如何处理

javascript - 获取数组中超过 4294967295 个对象