手続き上の解決策:
xs = [0,1,2,3,4,5,6,7,8,9]
result = []
n = 2 // n=3 gives a list of triples, etc
for(var i = 0; i < xs.length; i += n)
result.push(xs.slice(i, i + n))
関数型プログラミング ソリューション:
function zip() {
var args = [].slice.call(arguments, 0);
return args[0].map(function(_, n) {
return args.map(function(a) {return a[n] })
})
}
xs = [0,1,2,3,4,5,6,7,8,9]
result = zip(
xs.filter(function(_, n) { return n % 2 == 0 }),
xs.filter(function(_, n) { return n % 2 != 0 })
)
// [[0,1],[2,3],[4,5],[6,7],[8,9]]
説明: zipN 個の配列を取り、同じ位置で要素をグループ化する関数 (一部のプログラミング言語では組み込みですが、Javascript では組み込まれていません) です。
zip([1,2,3], [10,20,30]) -> [ [1,10], [2,20], [3,30] ]
配列を偶数部分と奇数部分に分割します。
[0,2,4,6...]
[1,3,5,7...]
それらをzip一緒にして、順序付けられたペアのリストを取得します。