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,但它似乎无法映射到元素的任何内容?
我有(使用下划线):
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();
这还是有点难看。如何实现转换(无显式循环)?
使用取模运算符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]]
演示
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];
});
或
return arr.map(function(_, i) {
return arr.slice(i, 2);
}).filter(function(_, i) {
return i%2==0;
})
另请参阅将数组拆分为块以获取更多变体(其中一些非常实用)。
一个循环中的另一个有线解决方案。
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);
你不能做这样的事情吗?
根据安迪的建议进行编辑以防止原件被更改
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();
相关文章:
- 如何在映射数组中添加换行符
- ng映射方向备选方案
- 无法通过数组映射绑定
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 使用Scala Play Framework视图中的键检索映射值
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- 淘汰映射;不起作用
- 使用map来检查是否为真'不起作用
- 回调函数中传递参数的困难(Google Map API Markers)
- 映射数组ES6时考虑空值
- Lodash映射并返回唯一
- 使用API在我的网站Google-Map上显示搜索地址的纬度和经度
- 如何对映射插件创建的敲除对象进行深度复制
- How to declare a Map containing certain properties with flow
- 如何将i18n.map转换为json对象
- 在javascript中按映射中的值排序
- Array.map 希望将值映射到无
- d3.js choropleth map——如何将多个属性从CSV映射到JSON,以便在工具提示中使用它
- 为什么你不能返回一个对象到Javascript's Array.map()并且它正确地映射它?
- 有可能只映射数组的一部分吗?(Array.map())