2014-01-17 2 views
0

Мне нужно проверить, содержит ли массив номер 2 все значения в массиве номер 1. Я не знаю ни одного метода, который делает это, поэтому я разработал тот, который работает, я думаю , Есть ли лучший способ сделать это, это хорошее решение?Проверьте, находятся ли значения одного массива в другом

var contains = function(a1, a2){ 
var cCount = 0; 
for (var i=0; i<a1.length; i++){ 
    for (var j=0; j<a2.length; j++){ 
     if (a1[i] == a2[j]){ 
      cCount++;    
     }}} 
if (cCount == a1.length){ 
    return true; 
} 

    }; 
+1

будет ли он содержать его в том же порядке или это не имеет значения? – Shehabix

+0

Нет, порядок не имеет значения. – dandlezzz

+0

На самом деле, есть решение ... Я отправлю его ниже – Shehabix

ответ

0

только немного упрощенный код:

function contains(array1, array2){ 
    var found = false; 
    for (i in array1) { 
     for (j in array2) { 
      if (array1[i] == array2[j]) { 
       found = true; 
      } 
     } 
     if (!found) return false; 
    } 
    return true; 
} 

другое решение мне не очень нравится, но он короче ...

function contains (arr1, arr2) { 
    var specialChar = "|"; // Use any char or a sequence that won't exist in values. 
    var str = specialChar + arr2.join(specialChar) + specialChar; 
    for (i in arr1) if (str.indexOf(specialChar + arr1[i] + specialChar) == -1) return false; 
    return true; 
} 
+0

Хороший рефакторинг – dandlezzz

+0

Если заказ не имеет значения, тогда никакое другое решение не возможно – Shehabix

+0

Нет другого решения? Это такая базовая концепция, я удивлен, что уже не существует метода jQuery. – dandlezzz

1

Вы можете проверить размеры перед запуском. return false, если вместо него не используется счетчик. и верните true, если он достигнет конца. И используйте indexof вместо этого, переходя через a2 каждый раз.

var contains = function(a1, a2){ 
    if (a1.length>a2.length) return false; 
    for (var i=0; i<a1.length; i++){ 
     if (a2.indexOf(a1[i])<0) return false; 
    } 
    return true; 
} 
+0

Я думаю, что вы перепутали свои скобки на втором, если – Tyler

+0

исправлено сейчас, спасибо. –

+1

Ваше решение написано лучше, чем мое (тот, который был правильно указан ниже), я не знал, что indexOf работает напрямую с массивами, не преобразовывая их в строки – Shehabix

0

Ваше решение O (п * п), т. е. порядок n-квадрат.

Сначала вы можете отсортировать массивы, а затем последовательно проверять элементы в отсортированных массивах для соответствия. Это даст вам решение O (n log n). Также вы можете закоротить проверку, убедившись, что размер массива2 < = размер массива1.

Очевидно, это имеет значение только в том случае, если ваши массивы достаточно велики.

0

Вы можете сделать это в O (n), если у вас есть третий объект, который вы используете для отслеживания предметов, которые уже были замечены. Это предполагает, что поиск в seen является O (1) (которые, предположительно, это - What's the big O for JavaScript's array when used as a hash?)

var seen = {}; 
arr2.forEach(function(el) { 
    seen[el] = true; 
}); 

var allContained = true; 
arr1.forEach(function(el) { 
    if (allContained && !seen[el]) {  
    allContained = false; 
    } 
}); 

return allContained; 
0

Я лично использую метод Array.every() (хотя это, конечно, зависит от браузера, который реализует этот метод) в сочетании с Array.indexOf(), что привело бы к чему-то похожее на следующее:

var contains = function(needle, haystack){ 
    return needle.every(function(a){ 
     return haystack.indexOf(a) > -1; 
    }); 
}; 

Объединение, что с подходом вы уже дали (тестирование для браузера-поддержки):

var contains = function(needle, haystack){ 
    if ([].every){ 
     return needle.every(function(a){ 
      return haystack.indexOf(a) > -1; 
     }); 
    } 
    else { 
     var result = true; 
     for (var i = 0, len = needle.length; i < len; i++){ 
      if (haystack.indexOf(needle[i]) === -1) { 
       return false; 
      } 
     } 
     return result; 
    } 
} 
var a1 = [1,2,3], 
    a2 = [1,2,3,4]; 
console.log(contains(a1, a2)); 

JS Fiddle demo.

Обратите внимание, что код else не оптимизирован, он просто демонстрирует код. Сказав это, имеется прокладка для Array.every() на странице MDN (в приведенных ниже ссылках), что может облегчить задачу.

Ссылки:

Смежные вопросы