javascript - 嵌套列表的Javascript长度
问题描述
目标:给定一个混合类型的数组,确定每个级别的元素数量。如果同一级别有两个子数组,则它们的每个元素都计入该级别的元素总数。
方法:
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 map
,map
创建了一个新数组,而forEach
没有。
这是在JSBin
推荐阅读
- java - 为什么 ChronoLocalDate 和 ChronoLocalDateTime 被设计成完全不同的接口?
- java - 如何停止在 java 组合框中复制项目
- data-structures - 这段代码的空间复杂度是多少
- python - 使用 pytorch (LSTM) 预测未来 60 天
- postgresql - 护照书架没有将用户插入数据库
- reactjs - Typescript + Jest:导入在 jest 与开发模式中是不同的
- c# - Azure 应用服务限制 - 允许应用服务 A 用于应用服务 B
- python - 有没有办法将 python 模块组合到一个文件中?
- android - 2 显示广告时使用回收站视图getItemcount 方法列出?
- java - Spring Thymeleaf 缩短 url (form-get) 参数