Как проверить наличие нескольких значений в массиве Javascript
Итак, я использую Jquery и имею два массива с несколькими значениями, и я хочу проверить, существуют ли все значения в первом массиве во втором.
Например, пример 1...
Массив A содержит следующие значения
34, 78, 89
Array B содержит следующие значения
78, 67, 34, 99, 56, 89
Это вернет true
... пример 2:
Массив A содержит следующие значения
34, 78, 89
Array B содержит следующие значения
78, 67, 99, 56, 89
Это вернет false
... пример 3:
Массив A содержит следующие значения
34, 78, 89
Array B содержит следующие значения
78, 89
Это вернет false
До сих пор я пытался решить это:
- Расширение Jquery с помощью специального метода сравнения для сравнения двух массивов. Проблема в том, что это возвращает только true, когда массивы идентичны, и, как вы можете видеть из примера 1, я хочу, чтобы он возвращал true, даже если они не идентичны, но по крайней мере содержат значение
- используя Jquerys.inArray function, но это проверяет только одно значение в массиве, а не несколько.
Любой свет, который любой мог бы набросить на это, был бы большим.
Ответы
Ответ 1
function containsAll(needles, haystack){
for(var i = 0 , len = needles.length; i < len; i++){
if($.inArray(needles[i], haystack) == -1) return false;
}
return true;
}
containsAll([34, 78, 89], [78, 67, 34, 99, 56, 89]); // true
containsAll([34, 78, 89], [78, 67, 99, 56, 89]); // false
containsAll([34, 78, 89], [78, 89]); // false
Ответ 2
Исходное решение для JavaScript
var success = array_a.every(function(val) {
return array_b.indexOf(val) !== -1;
});
Вам нужны патчи для совместимости для every
и indexOf
, если вы поддерживаете старые браузеры, включая IE8.
Полное решение jQuery
var success = $.grep(array_a, function(v,i) {
return $.inArray(v, array_b) !== -1;
}).length === array_a.length;
Использует $.grep
с $.inArray
.
Решение ES2015
Собственное решение, приведенное выше, может быть сокращено с помощью синтаксиса функции ES2015 и его метода .includes()
:
let success = array_a.every((val) => array_b.includes(val))
Ответ 3
Я заметил, что вопрос заключается в том, чтобы решить это с помощью jQuery, но если кто-то еще, который не ограничен jQuery, приходит, тогда есть простое решение, использующее underscore js.
С помощью подчеркивания js вы можете:
_.intersection(ArrayA, ArrayB).length === ArrayA.length;
Из документов:
intersection_.intersection(* массивы) Вычисляет список значений, являющихся пересечением всех массивов. Каждое значение в результате присутствует в каждом из массивов.
_. пересечение ([1, 2, 3], [101, 2, 1, 10], [2, 1]); = > [1, 2]
Ergo, если один из элементов в ArrayA отсутствовал в ArrayB, то пересечение было бы короче, чем ArrayA.
Ответ 4
Один слой для проверки того, что все элементы в arr1
существуют в arr2
...
С es6:
var containsAll = arr1.every(i => arr2.includes(i));
Без es6:
var containsAll = arr1.every(function (i) { return arr2.includes(i); });
Ответ 5
Вы можете использовать эту простую функцию (переименованные переменные в соответствии с приведенным выше ответом для удобства чтения):
function contains(haystack, needles) {
return needles.map(function (needle) {
return haystack.indexOf(needle);
}).indexOf(-1) == -1;
}
Ответ 6
Попробуйте это.
var arr1 = [34, 78, 89];
var arr2 = [78, 67, 34, 99, 56, 89];
var containsVal = true;
$.each(arr1, function(i, val){
if(!$.inArray(val, arr2) != -1){
retVal = false;
return false;
}
});
if(containsVal){
//arr2 contains all the values from arr1
}