搜索数组中的元素 - *不是*原始对象特定的

时间:2011-09-15 17:00:19

标签: javascript arrays

http://jsfiddle.net/jENDR/3/

像这样的东西

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

var a = [];

a.push(test);

alert($.inArray(test2, a));
  

Test2 = -1

     

测试= 0

这是为什么?对象应该相同吗?它做了什么比较?

编辑:

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

我将使用自定义搜索功能。谢谢!

4 个答案:

答案 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'};

你有两个指向两个对象的变量:

References

比较两个变量时,只需比较指针即可。由于两个对象不同,指针不同,比较结果为false。 OTOH,如果您已完成以下代码

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

结果是testtest2指向同一个对象且相等。

enter image description here

(有关参考文献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

检查How do you determine equality for two JavaScript objects?

答案 3 :(得分:0)

a是一个数组,第一个元素是测试对象。<​​/ p>

inArray测试以查看传入的数组中的任何数组元素是否与test值相同。所以,你正在寻找test2对象的数组。但是,test2对象不在该数组中。 test2可能与test具有相同的内容,但它不是同一个对象。

总之,您的问题是:

test != test2

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

如果您想比较相同内容的两个对象,请参阅上一篇文章:Object comparison in JavaScript