У меня есть два массива JavaScript (A
и B
) это содержит объекты, которые я создал. Я хочу проверить что все объекты в массив A
содержатся в массиве B
, но не обязательно в том же порядке.
Что лучший способ состоит в том, чтобы сделать это?
Править:
Они - все фактические объекты, не примитивы, таким образом, я должен буду сравнить их содержание и структуру также (возможно, использующий что-то как JSON.stringify
).
Я хочу сделать это, потому что я изучаю Разработку через тестирование, и я хочу протестировать функции, которые возвращают списки объектов. Я должен протестировать, имеют ли возвращенные списки ожидаемые объекты в них, или не (порядок не имеет значения в этом случае).
Использование: 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;
}
Это, вероятно, самый простой метод, если не самый медленный.
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
, как вы упомянули в своем вопросе.