5

我有对象数组

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。

提琴手

4

3 回答 3

9

因为inArray用于===比较元素,而不同的对象永远不会===相互比较。(他们也不==是彼此。)

例如:

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

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

于 2013-10-01T08:46:59.150 回答
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
于 2013-10-01T08:56:44.317 回答
1

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

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

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

于 2013-10-01T09:10:24.163 回答