为什么jQuery.inArray不适用于对象数组

时间:2013-10-01 08:44:56

标签: javascript jquery

我有对象数组

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

3 个答案:

答案 0 :(得分:8)

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

E.g:

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

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

答案 1 :(得分:5)

您可以使用接受回调的函数:

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

答案 2 :(得分:1)

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

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

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