Javascript Arrays - проверка двух массивов объектов для одного и того же содержимого, игнорирование порядка
У меня есть два массива JavaScript (A
и B
), которые содержат объекты, которые я создал. Я хочу проверить, что все объекты в массиве A
содержатся в массиве B
, но не обязательно в том же порядке.
Каков наилучший способ сделать это?
Edit:
Это все реальные объекты, а не примитивы, поэтому мне нужно будет сравнить их содержимое и структуру (возможно, используя что-то вроде JSON.stringify
).
Я хочу сделать это, потому что я изучаю Test-Driven Development, и я хочу проверить функции, которые возвращают списки объектов. Мне нужно проверить, имеют ли возвращенные списки ожидаемые объекты в них или нет (порядок не имеет значения в этом случае).
Ответы
Ответ 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
, как вы упомянули в своем вопросе.