将数组转换为对象时遇到问题。
const data = [0, 1, 2, 3, 4, 5];
const arr = data.map((element, idx) => {
return {
f: element,
s: arr[idx + 1],
};
});
当然,arr
是[{f: 0, s: 1}, {f: 1, s: 2}, ...]
,但我想将map
的索引增加2。结果如下:
arr = [{ f: 0, s: 1}, { f: 2, s: 3 }, ...]
是否可以使用类似map
的方法来产生结果?
答案 0 :(得分:4)
如果我正确理解了您的问题,则可以通过 Array.reduce
进行此操作:
const data = [0, 1, 2, 3, 4, 5];
const result = data.reduce((r,c,i,a) => {
if(i%2 == 0)
r.push({ f: i, s: a[i+1] })
return r
}, []);
console.log(result)
这个想法是结合使用%
运算符和reduce
将仅想要的值推入accumulator
数组中。
使用地图执行此操作会比较棘手,因为map
会通过every
元素,并期望与reduce
可以有任何结果类型/长度的地方一样数量的元素由accumulator
指定。
答案 1 :(得分:0)
reduce
几乎可以做任何事情,但这很不合适:
arr = data.reduce( ( acc, item, i ) => {
if ( i % 2 === 0 ) {
acc[ acc.length - 1 ].s = item
} else {
acc.push({ f: item })
}
return acc
}, [] )
更好地使用良好的for循环拆分数组,然后映射它:
var pairwise = arr => {
var pairs = []
for ( var i = 0; i < arr.length; i++ ) {
pairs.push([ arr[ i ], arr[ i + 1 ] ])
}
return pairs
}
arr = pairwise( data ).map( ([ f, s ]) => ({ f, s }) )