Как сравнить 4 массива в JS

385
27 октября 2017, 14:42

Всем добра. Делаю фильтр в реакте. Собрал 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 );
Answer 1

Не претендуя на оптимизированный по времени выполнения код, могу предложить применить к одному массиву метод фильтрации и оставить в этом массиве только те элементы, которые найдены в другом методом 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]), 
);

Answer 2

Советую использовать вам библиотеку 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)
)
READ ALSO
Как использовать геттеры и сеттеры из es6?

Как использовать геттеры и сеттеры из es6?

Помогите пожалуйста решить проблемуЕсть компонент, который представляет из себя форму для отправки вопросов

338
Почему нельзя обратиться через точку к свойству объекта?

Почему нельзя обратиться через точку к свойству объекта?

У меня есть сервис, который возвращает объект с датами:

230
Объясните, пожалуйста, про Array.prototype.filter.call()

Объясните, пожалуйста, про Array.prototype.filter.call()

Есть такой кусочек кода, который отстортировывает все div'ыМне непонятно:

298
Поправить выпадающий список

Поправить выпадающий список

нужно что бы когда я начинаю вводить в поле город - в подсказке всплывали не все, а только начинающиеся на введенную букву

231