我可以将map()的索引增加2吗?

时间:2018-11-20 02:11:21

标签: javascript arrays functional-programming

将数组转换为对象时遇到问题。

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的方法来产生结果?

2 个答案:

答案 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 }) )