Простым решением может быть просто удалить выбранный цвет из массива, чтобы его нельзя было выбрать в качестве дубликата.Тогда вам также не нужно беспокоиться о проверке дубликатов.
В этом коде предполагается, что colors
всегда столько же или длиннее, чем нужно.
let colors = ['red', 'white', 'blue'];
const shirts = [{ name: 'shirt1' }, { name: 'shirt2' }];
const shirtsWithColors = shirts.map((shirt) => {
// Make a copy of shirt so that we don't modify the one in the `shirts` array
const newShirt = {...shirt};
// Pick a color index
const colorToUseIndex = Math.floor(Math.random() * colors.length);
const colorToUse = colors[colorToUseIndex];
// Remove the picked color from the color array
colors.splice(colorToUseIndex, 1);
// Assign the color and return
newShirt.color = colorToUse;
return newShirt;
});
PS, если вырешите не использовать это решение, и чтобы продолжить что-то в том же духе, что и сейчас, я по крайней мере рекомендую вам перейти на использование карты (объекта), чтобы увидеть, использовались ли цвета или нет.Это сделает проверку намного проще:
const colors = ['red', 'white', 'blue'];
const usedColors = {};
...
// When you assign a color:
usedColors[colorIndex] = true;
...
// When checking if the color has been used:
if (usedColors[colorIndex]) {
// Try picking a different color
}