У меня проблема с Javascript.
var reponseValide1 = [{
title: "test"
}, {
text: "test"
}];
var reponseValide2 = [{
title: "test"
}];
console.log(reponseValide1.indexOf(reponseValide2[0]));
Вышеприведенный код регистрирует false
. Я не понимаю, почему. reponseValide2
содержит один и тот же объект с одинаковыми переменными и типами. Можете ли вы помочь мне понять, почему, пожалуйста?
Под капотом 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
"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;
}
}
это потому, что эти объекты не ссылаются на один и тот же объект. Вы также можете использовать этот код для получения согласованного индекса.
reponseValide1.findIndex(obj => obj.title == reponseValide2[0].title)
-1
вместоfalse
. он не ищет ту же ссылку на объект. он ищет другой объект.-1