Подтвердить что ты не робот

Javascript Arrays - проверка двух массивов объектов для одного и того же содержимого, игнорирование порядка

У меня есть два массива JavaScript (A и B), которые содержат объекты, которые я создал. Я хочу проверить, что все объекты в массиве A содержатся в массиве B, но не обязательно в том же порядке.

Каков наилучший способ сделать это?

Edit:

Это все реальные объекты, а не примитивы, поэтому мне нужно будет сравнить их содержимое и структуру (возможно, используя что-то вроде JSON.stringify).

Я хочу сделать это, потому что я изучаю Test-Driven Development, и я хочу проверить функции, которые возвращают списки объектов. Мне нужно проверить, имеют ли возвращенные списки ожидаемые объекты в них или нет (порядок не имеет значения в этом случае).

4b9b3361

Ответ 1

Использование: isEqArrays(arr1, arr2)

//
// Array comparsion
//

function inArray(array, el) {
  for ( var i = array.length; i--; ) {
    if ( array[i] === el ) return true;
  }
  return false;
}

function isEqArrays(arr1, arr2) {
  if ( arr1.length !== arr2.length ) {
    return false;
  }
  for ( var i = arr1.length; i--; ) {
    if ( !inArray( arr2, arr1[i] ) ) {
      return false;
    }
  }
  return true;
}

Ответ 2

Если дубликаты также не имеют значения, вы можете сделать однострочные выражения, используя lodash. Посмотрите, не отличается ли разница между двумя массивами.

if (_(array_1).difference(array_2).isEmpty()) {
    // is equal ignoring order and duplicates
}

console.log(_([1,2,3]).difference([2,3,1]).isEmpty()) // -> true
console.log(_([1,2,3,3]).difference([2,3,1,1]).isEmpty()) // -> also true

Ответ 3

Это, вероятно, самый простой способ, если не самый медленный.

var o = { PropA: 1, PropB: 2 };
var a = [1, 2, 3, 4, o];
var b = [2, 3, 4, 1];

var c = a.filter(function(value, index, obj) {
    return b.indexOf(value) > -1;
});

if (c.length !== a.length) {
    throw new Error("Array b is missing some elements!");
}

indexOf будет проверять, что они относятся к одному и тому же объекту. Если вы хотите проверить эквивалентность значений, вам придется выполнить глубокое сравнение свойств или использовать JSON.stringify, как вы упомянули в своем вопросе.