Всем добра. Делаю фильтр в реакте. Собрал 5 массивов объектов. Нужно сравнить их и на выходе получить массив из совпадений. Пробовал так, не получается.
Массивы ITEMS,findList,categoryList, metroList, searchList. В filterSearch надеюсь получить результат.
function search(a, b) {
const result = [];
for(let i = 0; i < b.length; i++) {
if (a.indexOf(b[i]) == -1) {
result.push(b[i]);
}
}
return result;
}
const filterFind = search(ITEMS, findList);
const filterCategory = search( filterFind, categoryList);
const filterMetro = search( filterCategory, metroList);
const filterSearch = search( filterMetro , searchList );
Не претендуя на оптимизированный по времени выполнения код, могу предложить применить к одному массиву метод фильтрации и оставить в этом массиве только те элементы, которые найдены в другом методом includes. На выходе получить массив - пересечение этих двух массивов и к этому массиву-пересечению опять применить фильтр с includes в третьем массиве и так далее.
console.log([1,2,3,4,5].filter(e=>[10,5,3,2,0,9].includes(e))
.filter(e=>[10,2,0,5].includes(e))
.filter(e=>[5,3,2].includes(e))
.filter(e=>[15,2,3,9].includes(e)));
на выходе имеем из
[1,2,3,4,5]
[10,5,3,2,0,9]
[10,2,0,5]
[5,3,2]
[15,2,3,9]
пересечение
[2]
(не будет работать, когда в одном и том же массиве есть повторяющиеся элементы) мержить все массивы, делать объект у которого имена свойств - это элементы массива, а значения свойств - это количество вхождений во массивы, потом фильтровать фсе элементы количество вхождений которых меньше, чем количество массивов
console.log(
Object.entries(
[1, 2, 3, 4, 5]
.concat([10, 5, 3, 2, 0, 9])
.concat([10, 2, 0, 5])
.concat([5, 3, 2])
.concat([15, 2, 3, 9])
.reduce((p, c) => {
if (p[c] === undefined) {
p[c] = 0;
}
p[c] += 1;
return p;
}, {}),
)
.filter(e => {
return e[1] === 5;
})
.map(e => +e[0]),
);
Советую использовать вам библиотеку lodash (или underscore). В ней реализован метод intersection
Ваш пример
const array1 = ['1', '2']
const array2 = ['3', '2']
const array3 = ['4', '2']
const array4 = ['5', '2']
const array5 = ['6', '2']
console.log(
_.intersection(array1, array2, array3, array4, array5)
)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Помогите пожалуйста решить проблемуЕсть компонент, который представляет из себя форму для отправки вопросов
У меня есть сервис, который возвращает объект с датами:
Есть такой кусочек кода, который отстортировывает все div'ыМне непонятно:
нужно что бы когда я начинаю вводить в поле город - в подсказке всплывали не все, а только начинающиеся на введенную букву