#javascript
#javascript
Вопрос:
Если у меня есть один массив:
let x= [0,1,2,3,5]
И у меня есть массив с несколькими подмассивами:
let winningIndices = [[0, 1, 2], [6, 7, 8], [0, 3, 6], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
Как я могу проверить, содержит ли массив x все элементы какого-либо одного подмассива.
Другими словами, как я могу проверить, содержит ли массив x комбинации чисел 0,1,2 или 6,7,8…
Заранее спасибо
Комментарии:
1. Любой код для отображения в вашем текущем подходе?
2. Я вижу, вы убрали часть с крестиками-ноликами. Но я не вижу попытки кода решить эту проблему.
3. Это ваша структура данных, которая вызывает головную боль (для вас). Без контекста «крестики-нолики» вы вполне можете получить ответ, который логически работает, но не решает проблему. … Рассмотрите возможность использования 2-мерного массива для платы.
4. @GetSet Одномерный массив работал довольно хорошо, мне просто нужна была функция для сравнения массива. Спасибо за помощь
Ответ №1:
«Как я могу проверить, содержит ли массив x все элементы какого-либо одного подмассива».
Вот самая простая функциональная интерпретация.
const won = winningIndices.some(indices=>
indices.every(
item=>x.includes(item)
)
)
Ответ №2:
Это может быть вариантом. Если вы хотите удалить ключ xIncludesItem из результата, просто сопоставьте его снова.
const winningIndices = [
[0, 1, 2],
[6, 7, 8],
[0, 3, 6],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];
const x = [0, 1, 2, 3, 5];
const result = winningIndices
.map((item) => {
const xIncludesItem = item
.map((i) => x.includes(i))
.every(includes => includes);
return { item, xIncludesItem };
})
.filter(result => result.xIncludesItem);
console.log(result);
Ответ №3:
Array.includes работает намного медленнее, чем Set.has. Немного более производительным решением, основанным на решении Теда Браунлоу, было бы:
const setX = new Set(x);
const won = winningIndices.some(indices=>
indices.every(
item=>setX.has(item)
)
)