为什么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) )