Массив indexOf для проверки равенства объектов

1

У меня проблема с Javascript.

var reponseValide1 = [{
  title: "test"
}, {
  text: "test"
}];
var reponseValide2 = [{
  title: "test"
}];
console.log(reponseValide1.indexOf(reponseValide2[0]));

Вышеприведенный код регистрирует false. Я не понимаю, почему. reponseValide2 содержит один и тот же объект с одинаковыми переменными и типами. Можете ли вы помочь мне понять, почему, пожалуйста?

  • 0
    он может вернуть -1 вместо false . он не ищет ту же ссылку на объект. он ищет другой объект.
  • 0
    технически это лог -1
Показать ещё 3 комментария
Теги:

3 ответа

0

Под капотом Array.prototype.indexOf() в основном выполняет строгую проверку равенства для каждого элемента и возвращает индекс первого положительного результата.

В JavaScript равенство объектов определяется на основе того, имеют ли они одну и ту же ссылку.

Выражение, сравнивающее объекты, истинно, только если операнды ссылаются на один и тот же объект.

Для сравнения объектов, основанных на содержимом, требуется более активное решение - наиболее простым в том, чтобы обернуть каждый объект в JSON.stringify() (хотя это очень неэффективно). Более эффективные решения, как правило, связаны с сопоставлением отдельных ключей и ценностей.

См. Ниже примерную демонстрацию.

const A = {x: 'y'}
const B = {x: 'y'}
const AB = [A, B]
console.log(AB.indexOf(A)) // => 0
console.log(AB.indexOf(B)) // => 1
console.log(A === B) // => false
console.log(A === A) // => true
console.log(JSON.stringify(A) === JSON.stringify(B)) // => true
  • 1
    Хорошо, спасибо всем.
0

"reponseValide2" содержит один и тот же объект с одинаковыми переменными и типом

Нет, нет! Это может выглядеть так, но эти два - разные объекты. Равенство для объекта означает проверку того, являются ли они одним и тем же экземпляром (т.е. они указывают на один и тот же адрес в памяти).

Возьмите этот код, например:

a = {x: 1}
b = {x: 1}
console.log(a == b)
> false

В момент создания объект {x: 1} создается в памяти, а его адрес присваивается a. При создании второго объекта он будет помещен в другую область памяти, а b будет содержать другой адрес, чем a.

Если a и b были a и тем же объектом, то изменение a означало бы модификацию b тоже! Например:

a = {x: 1}
b = a
a.x = 2
console.log(b.x)
> 2

Если вы действительно хотите иметь один и тот же объект в своих массивах, вам сначала нужно создать его, а затем добавить к ним оба:

var myObj = {
  title: "test"   
};

var reponseValide1 = [
    myObj,
    {text: "test"}
];

var reponseValide2 = [myObj];

console.log(reponseValide1.indexOf(reponseValide2[0]));

Однако, если вы не хотите иметь один и тот же объект, но вы хотите проверить, равны ли они, вам придется сделать это вручную, проверяя, например, свойство text, например:

var reponseValide1 = [{
  title: "test"
}, {
  text: "test"
}];
enter code here

var reponseValide2 = [{
  title: "test"
}];

for (var i = 0; i < responseValide1.length; i++) {
    if (responseValide1[i].title == responseValide2[0].title) {
        console.log(i);
        break;
    }
}
0

это потому, что эти объекты не ссылаются на один и тот же объект. Вы также можете использовать этот код для получения согласованного индекса.

reponseValide1.findIndex(obj => obj.title == reponseValide2[0].title)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню