数组indexOf检查对象是否相等

时间:2018-10-29 11:08:33

标签: javascript

我在Javascript上遇到问题。

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

以上代码记录了false。我不明白为什么。 reponseValide2确实包含具有相同变量和类型的相同对象。你能帮我理解为什么吗?

3 个答案:

答案 0 :(得分:0)

在幕后,Array.prototype.indexOf()基本上是在每个元素上执行strict equality check,并返回第一个肯定结果的索引。

在JavaScript中,objects等于determined on the basis of whether they share the same reference

  

仅当操作数引用相同的对象时,比较对象的表达式才为真。

要根据内容比较对象,需要一个更复杂的解决方案-最简单的方法通常是将每个对象包装在JSON.stringify()中(尽管效率很低)。 More efficient solutions倾向于将各个键和值进行比较。

请参见下面的粗略演示。

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)

这是因为这些对象没有引用相同的对象。您也可以使用此代码获取匹配的索引。

CLLocationManager

答案 2 :(得分:0)

  

“ reponseValide2”确实包含相同的对象,具有相同的变量和类型

不,不是! 可能看起来像,但是那两个是不同的对象。对象相等意味着检查它们是否是相同的实例(即它们指向内存中的相同地址)。

以下面的代码为例:

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

在创建时,将在内存中创建{x: 1}对象,并将其地址分配给a。创建第二个对象时,它将被放置在不同的存储区域中,并且b将包含与a不同的地址。

如果ab是同一个对象,那么修改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;
    }
}