【发布时间】:2012-01-01 13:53:23
【问题描述】:
想象一下我有一个这样的 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]]],我决定用空分隔符来做。
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/
你会怎么做?谢谢!
【问题讨论】:
-
您的
split功能离您不远了。您可以通过添加两个数组包装器来删除null业务:if (cols == 1) return [array]和return [array.slice(0, size)].concat(split(array.slice(size), cols-1))。我发现这个递归版本比这里的大多数答案更具可读性。
标签: javascript arrays