it-roy-ru.com

Как проверить, существует ли несколько значений в массиве Javascript

Итак, я использую Jquery и имею два массива с несколькими значениями, и я хочу проверить, существуют ли all значения в первом массиве во втором.

Например, пример 1 ...

Массив A содержит следующие значения

34, 78, 89

Массив B содержит следующие значения

78, 67, 34, 99, 56, 89

Это вернет true

... пример 2:

Массив A содержит следующие значения

34, 78, 89

Массив B содержит следующие значения

78, 67, 99, 56, 89

Это вернет false

... пример 3:

Массив A содержит следующие значения

34, 78, 89

Массив B содержит следующие значения

78, 89

Это вернет false

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

  1. Расширение Jquery с помощью пользовательского метода сравнения для сравнения двух массивов. Проблема в том, что это возвращает true только когда массивы идентичны, и как вы можете видеть из примера 1, я хочу, чтобы он возвращал true, даже если они не идентичны, но по крайней мере содержат значение
  2. используя Jquerys .inArray function , но при этом проверяется только одно значение в массиве, а не несколько.

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

30
Betjamin
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
47
ggreiner

Собственное решение 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 with $.inArray .


ES2015 Solution

Приведенное выше нативное решение можно сократить, используя синтаксис функции стрелки ES2015 и метод .includes():

let success = array_a.every((val) => array_b.includes(val))
57
user1106925

Я заметил, что вопрос заключается в том, чтобы решить эту проблему с помощью jQuery, но если кто-то, кто не ограничен jQuery, придет, то есть простое решение с использованием подчеркивания js.

Используя подчеркивание js, вы можете сделать:

_.intersection(ArrayA, ArrayB).length === ArrayA.length;

Из документов:

intersection_.intersection (* массивы) Вычисляет список значений, которые являются пересечением всех массивов. Каждое значение в результате присутствует в каждом из массивов.

_.intersection ([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2]

Следовательно, если один из элементов в ArrayA отсутствует в ArrayB, то пересечение будет короче, чем ArrayA.

14
datacarl

Однострочник для проверки того, что все элементы в arr1 существуют в arr2...

С es6:

var containsAll = arr1.every(i => arr2.includes(i));

Без es6:

var containsAll = arr1.every(function (i) { return arr2.includes(i); });
10
pulse0ne

Вы можете использовать эту простую функцию (переименованные переменные в соответствии с ответом выше для легкого чтения):

function contains(haystack, needles) {

    return needles.map(function (needle) { 
        return haystack.indexOf(needle);
    }).indexOf(-1) == -1;
}
0
caleb

Если вам нужно немного больше увидеть, какие элементы в массиве, вы можете использовать это: 

var tools = {
        elem : {},
        arrayContains : function(needles, arrhaystack) {
           if (this.typeOf(needles) === 'array') {
                needle.reduce(function(result,item,$i,array){ // You can use any other way right there.
                    var present = (arrhaystack.indexOf(item) > -1);
                    Object.defineProperty(tools.elem, item, {
                        value : present,
                        writable : true
                    });
                },{})
                return this.elem;
            }
        },        
        typeOf : function(obj) {
            return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
        }
    }

Используйте это просто с var check = tools.arrayContains([10,'foo'], [1,'foo','bar'])

Тогда вы получите результат как 

10 : false
foo : true

Тогда, если вам нужно получить только один результат, если один из них верен, вы можете: 

arr = Object.values(check);
(arr.indexOf('true')) ? instru1 : instru2 ;

Я не думаю, что это лучший способ, но он работает и легко адаптируется .. Учитывая этот пример, я советую вам сделать Object.create(tools), прежде чем использовать его по-своему.

0
Daryl Cluzel

Попробуй это.

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 
}
0
ShankarSangoli