Массив с индексом объекта не соответствует ожиданиям

у меня есть массив

let arr = []

Я вставляю в него объект

let a = {name:"a", age: 20}
arr.push(a);

Я проверяю индекс ниже с тем же объектом, назначенным другой переменной

let b = {name:"a", age:20}

Я старался

arr.indexOf(b);

Я получаю -1, я ожидаю 0.

Пожалуйста, направь меня

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
43
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

JS выполняет сравнение объектов (и поиск) по ссылке, а не по значению. Следовательно: чтобы foo == bar было истинным, foo и bar должны быть одним и тем же объектом, а не просто объектом с одинаковыми свойствами и значениями:

console.info({name:"a", age:20} == {name:"a", age:20});

Следовательно, вместо indexOf вам нужно что-то вроде findIndex.

let arr = [];
let a = {name:"a", age: 20};
arr.push(a);
let b = {name:"a", age:20}

const index = arr.findIndex(item => item.name === b.name && item.age === b.age);
console.info(index);

indexOf использует ===, а не == приятель

Code Maniac 16.04.2019 08:23

Принцип верен как для ==, так и для ===.

mbojko 16.04.2019 08:24

Это связано с тем, что объекты являются ссылочными, переменные a и b указывают на две разные области памяти. Таким образом a != b

let a = {name:"a", age: 20};
let b = {name:"a", age:20}
console.info(a == b);

JavaScript не может сравнивать объекты по умолчанию. Вместо этого используйте Array.findIndex:

let arr = []

let a = {name:"a", age: 20}

arr.push(a);
let b = {name:"a", age:20}


console.info(arr.findIndex(elem => elem.name == b.name && elem.age == b.age));

Да, потому что Js сравнивает по ссылке, а не по значению

let arr = [];

let a = {
  name: "a",
  age: 20
};
arr.push(a);

let b = {
  name: "a",
  age: 20
};

console.info(arr.indexOf(b));

let arr = [];

let a = {
  name: "a",
  age: 20
};
arr.push(a);

let b = a

console.info(arr.indexOf(b));

Другие вопросы по теме