2017-01-24 2 views
0

У меня есть 2 объекта массивов (allUsers и friendsOnTrip). Оба этих массива имеют один и тот же формат. Каждый объект внутри них содержит информацию о пользователе (то есть firstName и lastName). Я пытаюсь сделать так, что если объект в одном массиве не находится в другом, то нажмите этот объект на новый массив, иначе нет.Объект не найден в пределах массива, хотя он

allUsers.forEach((user) => { 
    if (friendsOnTrip.indexOf(user) <= -1) { 
     this._friendsNotOnTrip.push(user); 
    } 
}); 

Проблема заключается в том, что даже если объект userкажется, как это в friendsOnTrip, то выражение:

if (friendsOnTrip.indexOf(user) <= -1) 

... все еще будет вычисляться true(что неправильно), поэтому я получаю объекты в пределах this._friendsNotOnTrip, которых не должно быть.

Пример одного из объектов:

{ 
    email: "[email protected]", 
    firstName: "foo", 
    lastName: "bar", 
    key: "123456789", 
    friends: [ 
     "987654321", 
     "246808642" 
    ], 
    location: { 
     lng: -1.24567, 
     lat: 50.9865 
    }, 
    usersToSeeLocation: [ 
     "987654321" 
    ] 
} 

Объекта в позиции 0 в allUsers и объекте в положении 0 в friendsOnTrip является же объектом. Я проверил отдельные атрибуты и получил следующие результаты:

console.log(allUsers[0].firstName === friendsOnTrip[0].firstName);     //true 
console.log(allUsers[0].lastName === friendsOnTrip[0].lastName);      //true 
console.log(allUsers[0].email === friendsOnTrip[0].email);       //true 
console.log(allUsers[0].friends === friendsOnTrip[0].friends);      //false 
console.log(allUsers[0].key === friendsOnTrip[0].key);        //true 
console.log(allUsers[0].location === friendsOnTrip[0].location);      //false 
console.log(allUsers[0].usersToSeeLocation === friendsOnTrip[0].usersToSeeLocation); //false 

console.log(allUsers[0] === friendsOnTrip[0]);          //false 

Заглянув friends, usersToSeeLocation и location в обоих allUsers[0] и friendsOnTrip[0], содержание является точно таким же, так что я не уверен, почему этими выражениями вычисляемых false.

+1

Они» не один и тот же объект. Они содержат одну и ту же информацию, но они все еще имеют объект с разным пространством в памяти. –

+1

Возможный дубликат [Сравнение объектов в JavaScript] (http://stackoverflow.com/questions/1068834/object-comparison-in-javascript) – sabithpocker

+0

У обоих объектов есть такие же ключи, как и значения? Если это так, вы можете попробовать с ** JSON.stringify ** оба объекта, а затем сравнить. Если оба объекта имеют один и тот же ключ, но имеют разные значения, то он должен быть 'return' false. –

ответ

3

Вы не можете сравнивать подобные объекты. Например

[{a: 1, b:2}].indexOf({a: 1, b:2}) 

возвращает -1. Вместо этого вы должны искать конкретного свойства, что-то вроде

allUsers.forEach((user) => { 
    if (friendsOnTrip.map(u => u.key).indexOf(user.key) <= -1) { 
     this._friendsNotOnTrip.push(user); 
    } 
}); 
+0

возможно, адрес электронной почты. –

+0

вы также можете создать строку из нескольких свойств, объединив их – fafl

+0

Это сработало, спасибо! Я полностью забыл об использовании '.map()' – wmash

0

«Заглянув внутрь друзей, usersToSeeLocation и место в обоих ALLUSERS [0] и friendsOnTrip [0], содержимое точно так же, так что я не уверен, о том, почему эти выражения оцениваются как ложные ".

Это потому, что они не то же самое. Они имеют одинаковое значение, но они не одни и те же объекты! Вот почему ваш «===» возвращает ложь Вы должны сравнить все индексы один за другим

вы можете сделать array1.join() === array2.join(), чтобы сделать ваш comparition быстрее

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