[obj3, obj2], [obj2, obj4], [obj5, obj2, obj8] ]
мне нужно взять из этого массива эелементы, которые есть во всех вложенных массивах, то есть в примере должен остаться только obj2
как такое можно сделать? какой метод юзать?
можно так const arr = [[1, 2], [3, 2], [2, 4], [5, 2, 8]]; arr.flat().reduce((acc, item) => { if (!acc[0].has(item)) { acc[0].add(item); } else { acc[1] = item; } return acc }, [new Set()])[1]
const inAllArrays = (arrays) => { const arraysCount = arrays.length; const occurencies = arrays.reduce((occurencies, array) => { array.forEach((element) => occurencies.set(element, occurencies.get(element) ?? 0 + 1) ); return occurencies; }, new Map()); return [...occurencies.keys()].filter( (element) => occurencies.get(element) === arraysCount ); }; мб, типа того, не проверял
вот это хороший вариант
или так понятнее const arr = [[1, 2], [3, 2], [2, 4], [5, 2, 8]]; const findRepeatInSubArr = arr => { const uniq = new Set(); return arr.flat().find(item => { if(!uniq.has(item)) { uniq.add(item); } else { uniq.clear(); return item; } }) }
спасибо, надеюсь сработает (хотя мне по хорошему все общие элементы во всех массивах взять)
так там и будет массив с элементами, которые есть во всех массивах
аа, тогда мое решение вернет только obj2, т.к. он во всех повторяется
нет, такого быть не должно, у меня проверка при добавлении
ну тогда проканает. иначе для простоты можно Set ещё на массив сначала кинуть, но мне в таком случае не нравится нарастающая сложость
если честно пишу говнокод, я пишу фильтр по условия AND как в exel, у меня много элементов, примерно пару тысяч, и при выборе 4х условий фильтр начинает работать по 5 секунд ожидания
const inAllArrays = (arrays) => { const arraysCount = arrays.length; const occurencies = arrays.reduce((occurencies, array) => { array.forEach((element) => occurencies.set( element, (occurencies.get(element) ?? new Set()).add(array) ) ); return occurencies; }, new Map()); return [...occurencies.keys()].filter( (element) => occurencies.get(element).size === arraysCount ); }; вот так, вроде как, должно быть ок, по-прежнему не проверял)
Есть еще такой вариант: const arr = [[1, 2], [3, 2], [2, 4], [5, 2, 8]]; const uniq = new Set(arr.flat()); const result = []; for (const value of uniq) { const avaliableInAll = arr.map(x => x.includes(value)); if (avaliableInAll.every(x => x)) result.push(value); }
const inAllArrays = (arrays) => { const elementsWithoutDuplicates = [...new Set(arrays.flat())]; const sets = arrays.map((array) => new Set(array)); return elementsWithoutDuplicates.filter((element) => sets.every((set) => set.has(element)) ); }; или ещё так, но надо чекать всё по производительности и т. п.
Обсуждают сегодня