我有阵列:[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();
这仍然有点难看。如何实现转换(没有显式循环)?
答案 0 :(得分:6)
map
function无法做到这一点,它是一种保留结构的转型。
你可以写这个" 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;
})
另请参阅Split array into chunks了解更多变体(其中一些非常实用)。
答案 1 :(得分: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]]
答案 2 :(得分:4)
一个循环中的另一个有线解决方案。
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>');
&#13;
或功能性(使用Fat_Freddy's idea)
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>');
&#13;
答案 3 :(得分:3)
尝试使用地图和过滤器的组合
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);
答案 4 :(得分:3)
你不能做这样的事吗?
根据Andy的建议,编辑以防止原件被改变
<workflow-app xmlns="uri:oozie:workflow:0.4"
答案 5 :(得分:1)
您可以尝试<!--[if (mso 12)|(mso 14)|(mso15)]>your code<![endif]-->
和while循环。
同样使用array.slice()
之类的函数,map
将迭代每个元素。
filter
&#13;