2015-04-15 10 views
5

Пусть говорят, у меня есть 2 массивыЕсть ли способ проверить, имеют ли два массива одинаковые элементы?

firstArray = [1, 2, 3, 4, 5]; 
secondArray = [5, 4, 3, 2, 1]; 

Я хочу знать, если они содержат одни и те же элементы, а порядок не важен. Я знаю, что могу написать функцию для их сортировки, а затем прокрутить их, чтобы проверить, но есть ли для этого встроенная функция? (Не только Vanilla JS, другой Javascript библиотека также хорошо)

+0

все элементы являются уникальными в массиве ?? – Pratik

+0

@Pratik Нет, сравнивая два массива. – Scimonster

+0

Да для моего случая, но было бы лучше, если бы он мог обрабатывать дублированные элементы. – cytsunny

ответ

4

Использование JQuery

Вы можете сравнить два массива с помощью jQuery:

// example arrays: 
var firstArray = [ 1, 2, 3, 4, 5 ]; 
var secondArray = [ 5, 4, 3, 2, 1 ]; 

// compare arrays: 
var isSameSet = function(arr1, arr2) { 
    return $(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0; 
} 

// get comparison result as boolean: 
var result = isSameSet(firstArray, secondArray); 

Вот JsFiddle Demo

Смотрите этот вопрос helpful answer

+0

Не нравится имя isIdentical, поскольку идентичный должен также включать в себя порядок, но способ делать это замечательно. – cytsunny

+0

@ user1273587 Спасибо. Какое имя переменной вы бы здесь использовали? Я подумал об этом несколько мгновений, но не имел лучшей альтернативы. Обновите приветствие! –

+0

Как насчет sameSet()? – cytsunny

1

Ну есть Array.sort() метод в JavaScript, и для сравнения (упорядоченные) массивы, я думаю, что лучше, чтобы проверить this question, как это имеет действительно хороший ответ.

Особенно обратите внимание, что сравнение массивов в виде строк (например, с помощью JSON.stringify) является очень плохо идеи, так как такие ценности, как "2,3" могут нарушить такую ​​проверку.

+0

Я думаю, что OP уже знает о вашем решении – thefourtheye

+0

Array.sort() изменяет фактический массив. Стоит клонировать массив, затем сортировать его, а затем проверять каждый элемент итеративно. – shmuli

-1

Не Vanila Javascript, но в Угловое есть возможность совместить два объекта.

angular.equals([1,2,3],[1,2,3]) 

Определяет, являются ли два объекта или два значения эквивалентными. Поддерживает типы значений, регулярные выражения, массивы и объекты.

Проверьте, не поможет ли это вам.

alert("Match result of [1,2,3] & [1,2,3] is "+angular.equals([1,2,3],[1,2,3])); 
 

 
alert("Match result of [1,4,3] & [1,2,3] is "+angular.equals([1,4,3],[1,2,3]));
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

Нажмите на Run фрагмент кода. Если это решит вашу потребность, отметьте это как ответ :)

В случае, если заказ не важен, а массив имеет тип номера.

var a1 = [1, 2, 3]; 
 
var a2 = [2, 1, 3]; 
 
//In case order is not important and array is of number type. 
 
alert(eval(JSON.stringify(a1).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")) === eval(JSON.stringify(a2).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")));

+0

Попробуйте '[1, 2, 3]' и '[3, 2, 1]'. OP хочет «true» для этого случая. – thefourtheye

+0

В этом случае вы можете напрямую перейти на простой Javascript-код. var a1 = [1, 2, 3]; var a2 = [2, 1, 3]; alert (eval (JSON.stringify (a1) .replace (/,/g, "+"). Replace (/ \ [/ g, "") .replace (/ \]/g, "")) == = eval (JSON.stringify (a2) .replace (/,/g, "+"). replace (/ \ [/ g, "") .replace (/ \]/g, ""))); – Sam4Code

+0

Сравнение массива по строке - это плохой способ. См. http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript – cytsunny

0

Вот рабочая реализация с использованием Vanilla JS:

function haveMatchingElements(firstArray, secondArray) { 
    var stringsInFirstArray = parse(firstArray, 'string'), 
     stringsInSecondArray = parse(secondArray, 'string'), 
     numbersInFirstArray = parse(firstArray, 'number'), 
     numbersInSecondArray = parse(secondArray, 'number'), 
     stringResults = compare(stringsInFirstArray, stringsInSecondArray), 
     numberResults = compare(numbersInFirstArray, numbersInSecondArray); 

    if (stringResults && numberResults) { 
     return true; 
    } return false; 

    function parse(array, type) { 
     var arr = []; 
     arr = array.sort().filter(function(index) { 
      if (typeof index == type) 
       return index; 
     }); 
     return arr; 
    } 

    function compare(firstArray, secondArray) { 
     if (firstArray.length !== secondArray.length) 
      return false; 
     for (var i = firstArray.length; i--;) { 
      if (firstArray[i] !== secondArray[i]) 
       return false; 
     } 
     return true; 
    } 
} 

Это разбирает струны число в различные массивы и проверяет их по отдельности. Это исправит вопрос 1 и "1", соответствующий true из-за неявного преобразования типов, вызванного функцией sort.

Реализация проста:

var arr1 = ['1', 1]; 
var arr2 = [1, '1']; 

var results = haveMatchingElements(arr1, arr2); 
console.log(results); // true 
Смежные вопросы