Javascript 在数组中搜索元素--*非*原始对象特定

Javascript 在数组中搜索元素--*非*原始对象特定,javascript,arrays,Javascript,Arrays,像这样的 var test = {a: 'a', b: 'b'}; var test2 = {a: 'a', b: 'b'}; var a = []; a.push(test); alert($.inArray(test2, a)); Test2=-1 测试=0 为什么会这样?对象应该是相同的,对吗?它在做什么样的比较 编辑: 澄清一些事情。下面的所有答案都非常有用。我使用一个数组来存储一对运行时值,即“页面”和“目录”。这些通常是分离的不相关值。我想设置一个包含特定对值的数组,并通

像这样的

var test = {a: 'a', b: 'b'}; var test2  =  {a: 'a', b: 'b'};

var a = [];

a.push(test);

alert($.inArray(test2, a));
Test2=-1

测试=0

为什么会这样?对象应该是相同的,对吗?它在做什么样的比较

编辑:

澄清一些事情。下面的所有答案都非常有用。我使用一个数组来存储一对运行时值,即“页面”和“目录”。这些通常是分离的不相关值。我想设置一个包含特定对值的数组,并通过创建一个对象,然后使用此方法搜索“允许的”对数组,来获得这两个不相关的密钥对关系


我将为此使用自定义搜索功能。非常感谢

有两个不同的对象(即使包含相同的值)

计算结果为
false


检查

一个
是一个数组,它的第一个元素是测试对象

inaray
测试传入数组中的任何数组元素是否与
test
值相同。因此,您正在a数组中查找
test2
对象。但是,
test2
对象不在该数组中
test2
可能与
test
具有相同的内容,但它不是相同的对象

总之,你的问题是:

test != test2
因为它们不是同一个对象。它们的内容可能相同,但它们不是相同的对象


如果要比较相同内容的两个对象,请参阅上一篇文章:。

您可以比较每个元素:

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

当您编写
{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
指向同一个对象并且相等

(更多关于参考文献的信息,也可以阅读)

您要做的是在
$.inArray()函数中使用深度比较。如果您的目标只是比较值,我建议您使用。由于情况并非如此,而且
$.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

当然,这会为您的特定问题带来更大的复杂性,因此您不需要使用它。但是,我认为注册这个想法可能是有效的:)

有没有一种简单的方法来完成我想做的事情?检查这个答案:检查这个问题:
> inArray(test2, a)
false
> inArray(test2, a, function(o1, o2){return o1 === o2;})
false
> inArray(test2, a, _.isEqual)
true