像这样的东西
var test = {a: 'a', b: 'b'}; var test2 = {a: 'a', b: 'b'};
var a = [];
a.push(test);
alert($.inArray(test2, a));
Test2 = -1
测试= 0
这是为什么?对象应该相同吗?它做了什么比较?
编辑:
澄清一些事情。以下所有答案都非常有用。我使用一个数组来存储运行时值对“页面”和“目录”。这些通常是分开的无关值。我想设置一个特定对值的数组,并能够通过创建一个对象来获得那两个不相关的,形成密钥对关系,然后使用这种方法搜索“允许”对的数组。
我将使用自定义搜索功能。谢谢!
答案 0 :(得分:1)
您可以比较每个元素:
function compareObjects(a, b) {
var areEqual = true;
for (var key in a) {
if (b[key] !== a[key]) {
areEqual = false;
break;
}
}
for (var key in b) {
if (b[key] !== a[key]) {
areEqual = false;
break;
}
}
return areEqual;
}
或者序列化记录和字符串比较:
JSON.stringify({a: 1, b: 2}) === JSON.stringify({"a": 1, "b": 2}); // true
答案 1 :(得分:1)
当您编写{a: 'a', b: 'b'}
时,您正在使用JavaScript创建一个新对象。当您再次编写 时,您将创建另一个对象,尽管两个对象包含相同的值。当您将其归因于变量时,变量只包含每个对象的引用(“指针”)。当你写
var test = {a: 'a', b: 'b'};
var test2 = {a: 'a', b: 'b'};
你有两个指向两个对象的变量:
比较两个变量时,只需比较指针即可。由于两个对象不同,指针不同,比较结果为false
。 OTOH,如果您已完成以下代码
var test = {a: 'a', b: 'b'};
var test2 = test;
结果是test
和test2
指向同一个对象且相等。
(有关参考文献on Wikipedia的更多信息。阅读pointers也很好。
您要做的是在$.inArray()
函数中使用深度比较。如果您的目标只是比较值,我建议您使用Underscore.js isEqual()
function。由于情况并非如此,并且$.inArray()
不接受比较器作为参数,我打赌你必须手动实现它:
function inArray(element, array) {
for (var key in array) {
if (_.isEqual(element, array[key])) {
return true;
}
}
return false;
}
编辑:好吧,如果我们的函数确实接收比较器作为参数,那就太棒了!
function inArray(element, array, cmp) {
if (typeof cmp != "function") {
cmp = function (o1, o2) {
return o1 == o2;
};
}
for (var key in array) {
if (cmp(element, array[key])) {
return true;
}
}
return false;
}
在Node.js中进行测试:
> inArray(test2, a)
false
> inArray(test2, a, function(o1, o2){return o1 === o2;})
false
> inArray(test2, a, _.isEqual)
true
当然,这会给您的特定问题带来更多复杂性,因此您无需使用它。但是,我认为注册这个想法可能是有效的:)
答案 2 :(得分:0)
有两个不同的对象(即使包含相同的值)。
test == test2
评估为false
。
答案 3 :(得分:0)
a
是一个数组,第一个元素是测试对象。</ p>
inArray
测试以查看传入的数组中的任何数组元素是否与test
值相同。所以,你正在寻找test2
对象的数组。但是,test2
对象不在该数组中。 test2
可能与test
具有相同的内容,但它不是同一个对象。
总之,您的问题是:
test != test2
因为它们不是同一个对象。它们的内容可能相同,但它们不是同一个对象。
如果您想比较相同内容的两个对象,请参阅上一篇文章:Object comparison in JavaScript。