Могу ли я увеличить индекс map () на 2? - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблема с преобразованием массива в объект.

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 }, ...]

Есть ли способ получить результат, используя метод like map?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

С помощью 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 }) )
0 голосов
/ 20 ноября 2018

Вы можете сделать это с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...