我编写了一个代码,用于根据步长将整数数组拆分为子数组(如果步长为空,还应该包括它)。我确信我的逻辑效率不高,如果有人有更好的解决方案,请帮助我。
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)
答案 0 :(得分:1)
我不确定你的意思&#34;它还应该包括步长是否为空&#34;,如果你的意思是如果步长为空它应该返回原始数组你可以把这个条件放在函数的开头,比如if range === ''{ return arr; }
我将它写入一个函数,因此它将更加通用,其中 arr 是要切片的数组, range 是步骤的大小
function chunkArrayInGroups(arr, range) {
var aux = []; //the output
for (var i = 0; i < (arr.length/range); i++){ // (arr.length/size) is the
//number of chunks
if ((size*i)%i === 0 || i === 0){
aux.push(arr.slice((range*i), (range*(i+1))));
}
}
return aux;
}
//Try it like
chunkArrayInGroups([0, 1, 2, 3, 4, 5], 2);
记住数组是从零开始的对象,所以你需要考虑0,这就是为什么我在if语句中使用i==0
时的条件。
Slice function返回一个数组的大块......它需要一个范围,就像函数一样。我希望这就是你在寻找的地方。