Это потому, что вы пытаетесь сравнить два разных экземпляра объектов, которые никогда не будут равны.
Но если вы преобразуете объекты в примитивные строки, выполняя JSON.stringify
, вы можете использовать Array.includes
для глубокого сравнения. Как указывало ttulka , это будет работать только в том случае, если объект для поиска имеет свойства в того же порядка , что и объект, который нужно найти в массиве.
const array = [{ name: 'John', age: 33 }];
const newName = {
name: 'John',
age: 33
};
if (array.map(obj => JSON.stringify(obj)).includes(JSON.stringify(newName))) {
console.log(newName.name + ' exists');
} else {
console.log('name does not exist');
}
Если вы посмотрите на полифилл Array#includes
в MDN, вы увидите, что сравнение происходит с использованием оператора строгого равенства ===
:
function sameValueZero(x, y) {
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
}
// 7. Repeat, while k < len
while (k < len) {
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
// b. If SameValueZero(valueToFind, elementK) is true, return true.
if (sameValueZero(o[k], valueToFind)) {
return true;
}
// c. Increase k by 1.
k++;
}
Поэтому, когда вы сравниваете два разных литерала объекта, используя ===
, они не будут равны:
console.log({name :"John"} === {name :"John"});
Но примитивные строки с другой стороны равны, если сравнивать их с ===
:
console.log('{name:"John"}' === '{name:"John"}');
Но то же самое не относится к объектам String:
console.log(new String('{name:"John"}') === new String('{name:"John"}'));