【发布时间】:2016-02-08 22:39:13
【问题描述】:
我编写了一个代码来根据步长将整数数组拆分为子数组(如果步长为空,它也应该包括在内)。我确定我的逻辑效率不高,如果有人有更好的解决方案,请帮助我。
var range = [10, 20, 20, 30, 100, 1000, 3420, 1124, 430, 700, 800,
35, 39, 12, 5046
]
var rangeSplit = [];
var max = Math.max.apply(null, range);
var bucketSize = max / 25;
var tempArr = []
var tempBucket = 0;
while (tempBucket < max) {
rangeSplit[bucketSize + tempBucket] = [];
tempBucket += bucketSize;
}
for (var i = 0; i < range.length; i++) {
var bucket = Math.ceil(range[i] / bucketSize)
if (rangeSplit[bucketSize * bucket] == undefined) {
rangeSplit[bucketSize * bucket] = [];
}
rangeSplit[bucketSize * bucket].push(range[i])
}
console.log(rangeSplit)
【问题讨论】:
-
对于初学者来说,预期的结果是什么?不需要 5000 个元素,但基本轮廓会有所帮助
-
您的脚本是否有效?如果您有工作代码并且正在寻找有关样式或效率的 cmets,codereview.stackexchange.com 是发布它的地方。 SO 适用于当您无法使其工作并需要帮助时。
-
您在
while循环中创建的大多数元素都不是数组元素。除非max是25的倍数,否则bucketSize将包含一个分数,并且数组索引必须是整数。所以你正在创建命名属性而不是数组元素。 -
你应该使用
rangeSplit[Math.ceil(bucketSize + tempBucket)] -
嗨@Barmar,我想这个问题应该去代码审查网站,我正在寻找我的解决方案是否好的答案或者我需要使用JS reduce函数,或者是否有更好的标准逻辑去做。
标签: javascript arrays math logic