想象一下,我有一个这样的JS数组:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; 我想要的是将该数组拆分为N个较小的数组。例如:
split_list_in_n(a, 2) [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11]]
For N = 3: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11]]
For N = 4: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]
For N = 5: [[1, 2, 3], [4, 5], [6, 7], [8, 9], [10, 11]] 对于Python,我有这个:
def split_list_in_n(l, cols): """ Split up a list in n lists evenly size chuncks """ start = 0 for i in xrange(cols): stop = start + len(l[i::cols]) yield l[start:stop] start = stop 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],然后我决定使用null分隔符进行操作。)
function split(array, cols) { if (cols==1) return array; var size = Math.ceil(array.length / cols); return array.slice(0, size).concat([null]).concat(split(array.slice(size), cols-1)); } 这是一个jsfiddle:http : //jsfiddle.net/uduhH/
你会怎么做?谢谢! 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您可以使条带“平衡”(子阵列的长度差异尽可能小)或“偶数”(除最后一个以外的所有子阵列具有相同的长度):
function chunkify(a, n, balanced) {
if (n < 2)
return [a];
var len = a.length,
out = [],
i = 0,
size;
if (len % n === 0) {
size = Math.floor(len / n);
while (i < len) {
out.push(a.slice(i, i += size));
}
}
else if (balanced) {
while (i < len) {
size = Math.ceil((len - i) / n--);
out.push(a.slice(i, i += size));
}
}
else {
n--;
size = Math.floor(len / n);
if (len % size === 0)
size--;
while (i < size * n) {
out.push(a.slice(i, i += size));
}
out.push(a.slice(size * n));
}
return out;
}
///////////////////////
onload = function () { function $(x) { return document.getElementById(x); }
function calc() {
var s = +$('s').value, a = [];
while (s--)
a.unshift(s);
var n = +$('n').value;
$('b').textContent = JSON.stringify(chunkify(a, n, true))
$('e').textContent = JSON.stringify(chunkify(a, n, false))
}
$('s').addEventListener('input', calc);
$('n').addEventListener('input', calc);
calc();
}
slice items into chunks: