2011-09-15 38 views
0

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

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

编辑:

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

我会为此使用自定义搜索功能。谢谢!

+0

看看这个问题:http://stackoverflow.com/questions/1068834/object-comparison-in-javascript – Joe

回答

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 
0

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

test == test2 

评估为false

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

+0

有没有一种简单的方法来做什么我正在努力? – bobber205

+0

检查答案:http://stackoverflow.com/questions/201183/how-do-you-determine-equality-for-two-javascript-objects –

0

a是一个数组,谁是第一个元素是测试对象。

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

总之,你的问题是:

test != test2 

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

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

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 

当然,这带来了更多的复杂性为您的特定问题,所以你不需要使用它。不过,我认为这可能是有效的注册这个想法:)