为什么jQuery.inArray不能处理对象数组

我有一些对象

var arr = [ {"id" : "1", "description" : "one"}, {"id" : "2", "description" : "two"}, {"id" : "3", "description" : "three"}] 

我需要获取索引,例如,对于id =“2”的对象。我这样做

 var index = jQuery.inArray( {"id" : "2", "description" : "two"}, arr ) 

在索引中我得到-1。

的jsfiddle

因为inArray使用===来比较元素,并且不同的对象永远不会彼此=== 。 (他们也不是彼此== 。)

例如:

 var a = {"foo": "bar"}; var b = {"foo": "bar"}; console.log(a === b); // "false" 

您需要在它们上创建一个方法来比较它们的等效性,然后自己进行搜索。

您可以使用带回调的函数:

 function arrayFind(arr, fn) { for( var i = 0, len = arr.length; i < len; ++i ) { if( fn(arr[i]) ) { return i; } } return -1; } var arr = [ {"id" : "1", "description" : "one"}, {"id" : "2", "description" : "two"}, {"id" : "3", "description" : "three"} ]; var result = arrayFind(arr, function(v){ return v.id === "2" && v.description === "two"; }); console.log(result) //1 

正如TJ所说, inArray使用===indexOf实际上,但这是相同的事情),因此即使相同的文字也不相等。 这是一个解决方法:

 var index = jQuery.inArray( JSON.stringify({"id" : "2", "description" : "two"}), $.map(arr, JSON.stringify) ) 

http://jsfiddle.net/7kg9P/1/