Вы можете «потреблять» массив допустимых значений для возврата.Под потреблением я подразумеваю удаление их из массива.
Например:
// List of all valid values (those that can be returned)
const colors = [ 'red', 'green', 'blue' ];
// The default color (when all others have been "consumed")
const defaultColor = 'black';
// The function that returns a random color
const getRandomColor = () => {
// At least we return a color
let color = defaultColor;
// If all colors were previously consumed, we won't need
// to pick one randomly
if (colors.length > 0) {
// We select randomly an index from the colors array
const index = Math.floor(colors.length * Math.random());
// We store the color to return
color = colors[index];
// We remove it from the array
colors.splice(index, 1);
}
return color;
};
console.log(getRandomColor());
console.log(getRandomColor());
console.log(getRandomColor());
console.log(getRandomColor());
console.log(getRandomColor());
console.log(getRandomColor());
Очевидная проблема с этим решением состоит в том, что вы не можете использовать свою функцию несколько раз.Лучшим решением было бы создание итератора.Каждый раз, когда какая-то часть вашего приложения должна генерировать случайную серию цветов, вы создаете новый итератор и используете его метод next
для получения нового значения.Проверьте следующее:
// The default color (when all others have been "consumed")
const defaultColor = 'black';
const RandomColorIterator = () => {
// List of all valid values (those that can be returned)
const colors = [ 'red', 'green', 'blue' ];
return {
next: () => {
// At least we return a color
let color = defaultColor;
// If all colors were previously consumed, we won't need
// to pick one randomly
if (colors.length > 0) {
// We select randomly an index from the colors array
const index = Math.floor(colors.length * Math.random());
// We store the color to return
color = colors[index];
// We remove it from the array
colors.splice(index, 1);
}
return color;
},
};
};
const iterator1 = RandomColorIterator();
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
console.log('1:', iterator1.next());
const iterator2 = RandomColorIterator();
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
console.log('2:', iterator2.next());
Я использовал функцию стрелки для получения прибыли из родительской области.Это позволяет получить доступ к colors
для каждого звонка.