У меня есть целевой массив ["apple","banana","orange"]
, и я хочу проверить, содержат ли другие массивы какой-либо из элементов целевого массива.
Например:
["apple","grape"] //returns true;
["apple","banana","pineapple"] //returns true;
["grape", "pineapple"] //returns false;
Как я могу сделать это в JavaScript?
javascript
arrays
Alex
источник
источник
for
цикл и переберите целевой массив. Если каждый элемент содержится в текущем массиве (используйтеcurrent.indexOf(elem) !== -1)
, тогда они все там.Ответы:
Ваниль JS
ES2016:
ES6:
Как это работает
some(..)
проверяет каждый элемент массива на соответствие тестовой функции и возвращает true, если какой-либо элемент массива проходит тестовую функцию, в противном случае возвращается false.indexOf(..) >= 0
иincludes(..)
оба возвращают true, если данный аргумент присутствует в массиве.источник
true
если какой-либо элемент массива прошел тестовую функцию. В противном случае он возвращаетсяfalse
.[false, false, false]
вместо пустого массива[]
?Ваниль JS
источник
some()
это рад. Выходит, как только что-то совпадает.arr.some(v=> haystack.indexOf(v) >= 0)
arr.some(v => haystack.includes(v))
arr1.some(v => arr2.indexOf(v) >= 0)
.includes
, поскольку, по-видимому, это не поддерживается в IE: stackoverflow.com/questions/36574351/…Если вы не против использования библиотеки, http://underscorejs.org/ имеет метод пересечения, который может упростить это:
Функция пересечения вернет новый массив с элементами, которым он соответствует, и, если не соответствует, возвращает пустой массив.
источник
ES6 (самый быстрый)
ES2016
Подчеркивать
ДЕМО: https://jsfiddle.net/r257wuv5/
jsPerf: https://jsperf.com/array-contains-any-element-of-another-array
источник
Если вам не нужно приведение типов (из-за использования
indexOf
), вы можете попробовать что-то вроде следующего:Где
arr
содержит целевые элементы. В концеfound
покажет, имел ли второй массив хотя бы одно совпадение с целью.Конечно, вы можете поменять числа для всего, что вы хотите использовать - строки в порядке, как ваш пример.
И в моем конкретном примере, результат должен быть,
true
потому что второй массив3
существует в цели.ОБНОВИТЬ:
Вот как я могу организовать это в функцию (с некоторыми незначительными изменениями по сравнению с предыдущим):
ДЕМО: http://jsfiddle.net/u8Bzt/
В этом случае функцию можно изменить, чтобы
targetArray
она передавалась в качестве аргумента, а не была жестко закодирована в замыкании.UPDATE2:
Хотя мое решение, приведенное выше, может работать и (возможно, более) читабельно, я считаю, что «лучший» способ справиться с описанной мной концепцией - сделать что-то немного по-другому. «Проблема» с вышеприведенным решением состоит в том, что
indexOf
внутри цикла происходит полное зацикливание целевого массива для каждого элемента в другом массиве. Это можно легко «исправить» с помощью «поиска» (карта ... литерал объекта JavaScript). Это позволяет использовать два простых цикла для каждого массива. Вот пример:ДЕМО: http://jsfiddle.net/5Lv9v/
Недостатком этого решения является то, что только числа и строки (и логические значения) могут использоваться (правильно), поскольку значения (неявно) преобразуются в строки и задаются в качестве ключей для карты поиска. Это не совсем хорошо / возможно / легко сделать для не буквальных значений.
источник
undefined
... вот для чего!!
» - это неправильно. Это вернет булеву оппозицию!
.Решение ES6:
В отличие от этого: должен содержать все значения.
Надеюсь, будет полезно.
источник
Вы можете использовать lodash и сделать:
Пересечение множеств выполняется в обеих коллекциях, создавая массив идентичных элементов.
источник
intersection
будет продолжать сравнивать даже после нахождения первого совпадения, чтобы найти все из них. Это все равно что использоватьfilter
когда нужно простоfind
.Использование фильтра / indexOf :
источник
Или вы можете даже добиться лучшей производительности, если сначала узнаете, какой из этих двух массивов длиннее, и выделите
Set
для самого длинного массива, аsome
метод для самого короткого:источник
indexOf
иincludes
, вы первыми отвечаете более эффективным решением на основе множеств, используя нативноеSet
, спустя 4 года после его введения в EcmaScript. +1Я нашел этот короткий и приятный синтаксис для соответствия всех или некоторых элементов между двумя массивами. Например
// ИЛИ операция. найти, существует ли какой-либо из элементов array2 в array1. Он вернется, как только будет найдено первое совпадение, так как некоторые методы прерываются, когда функция возвращает TRUE.
// печатает ИСТИНА
// И операция. найти, если все элементы array2 существуют в array1. Это вернется, как только не будет первого совпадения, так как какой-то метод прерывается, когда функция возвращает TRUE
// печатает ЛОЖЬ
Надеюсь, что это поможет кому-то в будущем!
источник
Вы можете использовать вложенный вызов Array.prototype.some. Преимущество заключается в том, что он будет освобожден при первом совпадении вместо других решений, которые будут проходить через полный вложенный цикл.
например.
источник
Вот интересный случай, которым я поделился.
Допустим, у вас есть массив объектов и массив выбранных фильтров.
Чтобы применить выбранные фильтры к этой структуре, мы можем
источник
Я написал 3 решения. По сути, они делают то же самое. Они возвращают истину, как только получают
true
. Я написал 3 решения только для того, чтобы показать 3 разных способа сделать что-то. Теперь это зависит от того, что вам нравится больше. Вы можете использовать performance.now () для проверки производительности одного или другого решения. В своих решениях я также проверяю, какой массив является самым большим, а какой - самым маленьким, чтобы сделать операции более эффективными.Третье решение, возможно, не самое симпатичное, но эффективное. Я решил добавить его, потому что в некоторых интервью по кодированию вам не разрешено использовать встроенные методы.
Наконец, конечно ... мы можем придумать решение с 2 NESTED для циклов (методом грубой силы), но вы хотите этого избежать, потому что сложность времени плохая O (n ^ 2) .
Замечания:
indexOf () против включает в себя ()
Какой из них имеет лучшую производительность ?
indexOf()
немного, но включает в себя более читабельным, на мой взгляд.Если я не ошибаюсь
.includes()
иindexOf()
использую петли за сценой, то вы будете в точке O (n ^ 2) при использовании их с.some()
.ИСПОЛЬЗОВАНИЕ петли
USING .some ()
ИСПОЛЬЗОВАНИЕ КАРТ Временная сложность O (2n) => O (n)
Код по моему: stackblitz
Я не эксперт по производительности и не BigO, так что если что-то, что я сказал неправильно, дайте мне знать.
источник
Как насчет использования комбинации некоторых / findIndex и indexOf?
Так что-то вроде этого:
Чтобы сделать его более читабельным, вы можете добавить эту функцию к самому объекту Array.
Примечание. Если вы хотите что-то сделать с предикатом, вы можете заменить внутренний indexOf другим findIndex и предикатом.
источник
Мое решение использует помощники массивов Array.prototype.some () и Array.prototype.include (), которые также выполняют свою работу довольно эффективно.
ES6
источник
Еще одно решение
Проверьте, содержат ли a1 все элементы a2
источник
Это можно сделать, просто выполнив итерации по основному массиву и проверив, содержит ли другой массив какой-либо целевой элемент или нет.
Попробуй это:
ДЕМО в JSFIDDLE
источник
С подчеркиваниями
источник
indexOf
я думаю, обратное :). С другой стороны, я согласен с тем, что стараюсь не добавлять внешние библиотеки, если они на самом деле не нужны, но я не особо одержим этим, библиотеки третьих сторон предлагают не только полезные, но и надежные функции. Например: проверяли ли вы все крайние случаи и браузеры мэров с вашим решением? .. (кстати,every
не пытается найти индекс в списке, а оценивает что-то в каждом элементе списка)Добавление в Array Prototype
Отказ от ответственности: многие настоятельно рекомендуют против этого. Единственный раз, когда это действительно было бы проблемой, было, если бы библиотека добавила функцию-прототип с тем же именем (которая ведет себя по-разному) или что-то в этом роде.
Код:
Без использования функций большой стрелки:
Применение
источник
Vanilla JS с частичным совпадением и без учета регистра
Проблема с некоторыми предыдущими подходами состоит в том, что они требуют точного соответствия каждого слова . Но что делать, если вы хотите предоставить результаты для частичных совпадений?
Это полезно, когда вы хотите предоставить окно поиска, где пользователи будут вводить слова, и результаты могут содержать эти слова в любом порядке, положении и регистре.
источник
Обновите ответ @Paul Grimshaw, используйте
includes
insteed ofindexOf
для более читабельногоисточник
Я придумал решение в узле с использованием подчеркивания js вот так:
источник
Лично я бы использовал следующую функцию:
Метод toString () всегда будет использовать запятые для разделения значений. Будет действительно работать только с примитивными типами.
источник
Массив .filter () с вложенным вызовом .find () вернет все элементы в первом массиве, которые являются членами второго массива. Проверьте длину возвращенного массива, чтобы определить, был ли какой-либо из второго массива в первом массиве.
источник
источник
источник