繁体   English   中英

Array.map想要将值映射到空

[英]Array.map want to map a value to nothing

我有阵列: [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();

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

map函数不能这样做,它是一个保持结构的转换。

你可以把这个“chunking”写成一个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];
});

要么

return arr.map(function(_, i) {
    return arr.slice(i, 2);
}).filter(function(_, i) {
    return i%2==0;
})

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

使用模运算符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]]

DEMO

一个循环中的另一个有线解决方案。

 var array = [1, 2, 3, 4, 5, 6, 7], result = array.reduce(function (r, a, i) { i & 1 && r[i >> 1].push(a) || r.push([a]); return r; }, []); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

或功能(它利用了Fat_Freddy的想法

 function due(array) { return array.length && [array.splice(0, 2)].concat(due(array)) || []; } var array = [1, 2, 3, 4, 5, 6, 7], result = due(array.slice()); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

尝试结合使用地图和过滤器

var output = [1,2,3,4,5,6,7].map(function(value,index,arr){
   if(index%2==0)
   {
     //return [value, arr[index+1]];
     return index + 1 < arr.length ? [value, arr[index+1] ] : [ value ];
   }
   else
   { 
     return false;
   }
}).filter(function(value){return value});
console.log(output);

你不能这样做吗?

根据Andy的建议,编辑以防止原件被改变

var temp = original.slice();
var newList = [];
while(temp.length)
{
    newList.push(temp.splice(0,2));
}

您可以尝试使用array.slice()和while循环。

同样使用map函数, filter将迭代每个元素。

 function splitArrayInLength(arr, len) { var returnArr = []; var index = 0; while(index < arr.length){ returnArr.push(arr.slice(index, index + len)); index += len; } return returnArr; } function main() { var arr = [1, 2, 3, 4, 5, 6, 7]; print(splitArrayInLength(arr, 2)); print(splitArrayInLength(arr, 4)); } function print(obj){ document.write("<pre>" + JSON.stringify(obj, 0, 4) + "</pre><br/>"); } main(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM