如何使用jQuery在JavaScript数组中查找对象的索引

7

我正在尝试在jQuery中查找数组中对象的索引。 因为我想匹配某个属性上的对象,所以不能使用jQuery.inArray。 我正在使用:

jQuery.inObjectArray = function(arr, func)
    {
        for(var i=0;i<arr.length;i++)
            if(func(arr[i]))
                return i;
        return -1;
    }

然后调用:

jQuery.inObjectArray([{Foo:"Bar"}], function(item){return item.Foo == "Bar"})

有没有内置的方法?

可能是我自己的问题,但你的示例中是否有任何特定于jQuery的代码? - gnur
你只需要索引还是对象本身? - Felix Kling
我想要索引,我认为可以使用grep获取对象。 - Daniel
1个回答

7

不确定为什么 each() 对您无效:

已损坏 -- 请参见下面的修复方法

function check(arr, closure)
{
    $.each(arr,function(idx, val){
       // Note, two options are presented below.  You only need one.
       // Return idx instead of val (in either case) if you want the index
       // instead of the value.

       // option 1.  Just check it inline.
       if (val['Foo'] == 'Bar') return val;

       // option 2.  Run the closure:
       if (closure(val)) return val;
    });
    return -1;
}

Op评论的附加示例。

Array.prototype.UContains = function(closure)
{
    var i, pLen = this.length;
    for (i = 0; i < pLen; i++)
    {
       if (closure(this[i])) { return i; } 
    }
    return -1;
}
// usage:
// var closure = function(itm) { return itm.Foo == 'bar'; };
// var index = [{'Foo':'Bar'}].UContains(closure);

好的,我的第一个例子出了问题。经过6个月和多次点赞后,有人指出了这个问题。 : )

正确的方法是,check()应该像这样:

function check(arr, closure)
{
    var retVal = false; // Set up return value.
    $.each(arr,function(idx, val){
       // Note, two options are presented below.  You only need one.
       // Return idx instead of val (in either case) if you want the index
       // instead of the value.

       // option 1.  Just check it inline.
       if (val['Foo'] == 'Bar') retVal = true; // Override parent scoped return value.

       // option 2.  Run the closure:
       if (closure(val)) retVal = true;
    });
    return retVal;
}

这里的原因非常简单...返回值的作用域设置有误。
至少原型对象版本(我实际检查过的那个版本)是可以正常工作的。
感谢Crashalot。 是我自己的错误。

可能他使用了 $(arr).each() - ThiefMaster
1
谢谢。实际上我正在寻找一个像inArray的函数,就像我上面写的那个函数一样,它不需要我创建一个像你刚刚创建的函数那样的函数。所以为了使自己清楚,是否有内置函数可以执行您的函数所做的操作。但也许我在寻找太远。 - Daniel
是的。我实际上不喜欢jQuery的这一点...所有名称都太过于重载了。当然,硬币的另一面就是像PHP这样拥有数百个未命名空间顶级函数的东西。 - John Green
你好,约翰,你是如何解决jQuery.each这个问题的(引自jQuery API):“我们可以通过使回调函数返回false来在特定迭代中中断$.each()循环。 返回非false与for循环中的continue语句相同;它将立即跳到下一次迭代。” - Crashalot
没问题,John。我犯过更严重的错误 :) 顺便问一句,由于retVal返回true/false而不是索引值,我仍然很好奇它是如何工作的?我们最终通过将外部变量设置为第一个匹配值的索引(然后通过返回false打破循环)来解决了这个问题。 - Crashalot
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接