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
и цикл повторяется.