Сформировать n число уникальных массивов
Нужно получить n число массивов, в данном случае 2 (users = 2), в каждом должно быть по 4 рандомных и уникальных значения. Вот мой вариант решения. Как можно сократить, улучшить или какой еще есть ваш вариант решения? Спасибо
const arrText = ['Alfa Romeo', 'De Tomaso', 'Iran Khodro', 'Land Rover', 'Mercedes Benz', 'Rolls Royce', 'Ssang Yong', 'Chang Feng', 'Los Angeles', 'New York', 'Kansas City', 'Virginia Beach']
let users = ['1', '2']
function shuffle(arr) {
let result = []
let userArr = []
for (let i = 0; i < users.length * 4; i++) {
let random = Math.floor(Math.random() * (arr.length - i)) + i
let newArr = arr[random]
arr[random] = arr[i]
userArr.push((arr[i] = newArr))
}
for (let j = 0; j < users.length; j++) {
result[j] = userArr.slice(j * 4, j * 4 + 4)
}
console.log(result)
}
shuffle(arrText)
Ответы (2 шт):
Автор решения: Jour
→ Ссылка
Если я вас правильно понял, можно так)
const users = [1, 2]
let arrText = ['Alfa Romeo', 'De Tomaso', 'Iran Khodro', 'Land Rover', 'Mercedes Benz', 'Rolls Royce', 'Ssang Yong', 'Chang Feng', 'Los Angeles', 'New York', 'Kansas City', 'Virginia Beach']
const result = users.map(user => {
let arr = []
for (let i = 0; i < 4; i++) {
const rand = Math.floor(Math.random() * arrText.length)
arr.push(arrText[rand])
arrText.splice(rand, 1)
}
return arr
})
console.log(result)
Автор решения: Артём
→ Ссылка
Я использовал Тасование Фишера — Йетса для тасования элементов массива, а также функцию .splice для замены массива users последними 4-мя удалёнными элементами.
const array = [
'Alfa Romeo', 'De Tomaso', 'Iran Khodro', 'Land Rover',
'Mercedes Benz', 'Rolls Royce', 'Ssang Yong', 'Chang Feng',
'Los Angeles', 'New York', 'Kansas City', 'Virginia Beach'
];
const users = [ '1', '2' ];
function shuffle(array, users, size = 4) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
};
return users.map(() => array.splice(-1 * size, size));
};
console.log(shuffle(array, users));