I am trying to find the index of an object in an array in jquery. I cannot use jQuery.inArray because i want to match objects on a certain property. I am using:
jQuery.inObjectArray = function(arr, func)
    {
        for(var i=0;i<arr.length;i++)
            if(func(arr[i]))
                return i;
        return -1;
    }
and then calling:
jQuery.inObjectArray([{Foo:"Bar"}], function(item){return item.Foo == "Bar"})
Is there a built in way?
Not sure why each() doesn't work for you:
BROKEN -- SEE FIX BELOW
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;
}
Additional example for Op comments.
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);
Ok, my first example IS HORKED. Pointed out to me after some 6 months and multiple upvotes. : )
Properly, check() should look like this:
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;
}
The reason here is pretty simple... the scoping of the return was just wrong.
At least the prototype object version (the one I actually checked) worked.
Thanks Crashalot. My bad.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With