изменять объекты массива, добавляя свойство с последовательными значениями массива - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь преобразовать объекты в массив, добавив новое свойство number. Значение этого свойства должно быть получено из массива set с использованием последовательных значений, так что первый объект должен иметь значение 1, второй - значение 3 , а третий - значение 6, четвертый - значение 1 снова и так далее ...

Это то, что я пробовал

const set = [1, 3, 6];
const data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];
let position = 0;

const getItem = () => {
  if (position === 0) {
    position += 1;

    return set[0];
  }

  if (position <= set.length - 1) {
    return set[position];
  }

  return set[0];
};

const output = data.map((entry, index) => ({ ...entry, number: getItem() }));

console.log(output);

И это ожидаемый результат

[
  { id: 1, number: 1 },
  { id: 2, number: 3 },
  { id: 3, number: 6 },
  { id: 4, number: 1 },
  { id: 5, number: 3 },
  { id: 6, number: 6 },
];

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

getItem необходимо перенести position обратно в начало. Самый простой способ сделать это - использовать position = (position + 1) % set.length, например:

let position = -1;
const getItem = () => {
  position = (position + 1) % set.length;
  return set[position];
};

Живая копия:

const set = [1, 3, 6];
const data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];
let position = -1;

const getItem = () => {
  position = (position + 1) % set.length;
  return set[position];
};

const output = data.map((entry, index) => ({ ...entry, number: getItem() }));

console.log(output);

... хотя, думая об этом, нет особой причины position сам должен переноситься, если вы используете % set.length, когда получение из set:

let position = 0;
const getItem = () => {
  return set[position++ % set.length];
};

Я обычно оборачиваю его (первую версию), если индекс собирается таким образом выжить.

Или, если вам нужно сделать это только в пределах map, вам не нужны position или getItem, просто используйте index % set.length в map:

const output = data.map((entry, index) => ({ ...entry, number: set[index % set.length] }));

Живая копия:

const set = [1, 3, 6];
const data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];
let position = -1;

const output = data.map((entry, index) => ({ ...entry, number: set[index % set.length] }));

console.log(output);

Функция % length работает, потому что это операция с остатком: x % y - это остаток от целочисленного деления x на y. 0 % 3 равно 0, 1 % 3 равно 1, 2 % 3 равно 2, а затем 3 % 3 снова 0 и цикл повторяется.

2 голосов
/ 04 августа 2020

Вы можете выполнить замыкание по индексу (с поправкой на остаток от длины массива) и вернуть новые объекты.

const
    numbers = [1, 3, 6],
    data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }],
    result = data.map((i => o => ({ ...o, number: numbers[i++ % numbers.length] }))(0));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...