Array.map想要将值映射到空

Boy*_*ang 9 javascript functional-programming map-function

我有阵列: [1,2,3,4,5,6,7]

我想实现: [[1,2], [3,4], [5,6], [7]]

我在想Array.map,但它似乎无法映射到任何元素?

我有(使用Underscorejs):

arr.map(function(el, idx, arr) {
  if (idx%2 != 0) return null;
  if (idx == arr.length-1) return [el];
  return [el, arr[idx+1]]
}).compact();
Run Code Online (Sandbox Code Playgroud)

这仍然有点难看.如何实现转换(没有显式循环)?

Ber*_*rgi 6

map功能不能做到这一点,这是一个结构保留的转型.

你可以将这个"分块"写成reduce一个简单的循环,或者像奇怪的东西

var arr = [1,2,3,4,5,6,7];
return arr.filter(function(_, i) {
    return i%2==0;
}).map(function(x, i) {
    return i*2+1<arr.length ? [x, arr[i*2+1]] : [x];
});
Run Code Online (Sandbox Code Playgroud)

要么

return arr.map(function(_, i) {
    return arr.slice(i, 2);
}).filter(function(_, i) {
    return i%2==0;
})
Run Code Online (Sandbox Code Playgroud)

另请参阅将数组拆分为多个变体(其中一些非常实用).


And*_*ndy 6

reduce 使用模运算符的数组:

function chunk(arr, n) {
  return arr.reduce(function (p, c, i) {
    if (i % n === 0) p.push([]);
    p[p.length - 1].push(c);
    return p;
  }, []);
}

chunk(arr, 2); // [[1,2],[3,4],[5,6],[7]]
Run Code Online (Sandbox Code Playgroud)

DEMO