Как проверить наличие нескольких значений в массиве 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

До сих пор я пытался решить это:

Любой свет, который любой мог бы набросить на это, был бы большим.

Ответ 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 
}