2011-05-24 13 views
7

Estoy tratando de encontrar el índice de un objeto en una matriz en jquery. No puedo usar jQuery.inArray porque quiero hacer coincidir objetos en una propiedad determinada. estoy usando:Cómo encontrar el índice del objeto en una matriz de JavaScript con jQuery

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

y luego llamar a:

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

¿Existe una forma construida en?

+0

Podría ser yo, pero ¿hay algún código específico de jQuery en su ejemplo? – gnur

+0

¿Solo desea el índice o el objeto en sí? –

+0

Quiero el índice, creo que puedo obtener el objeto con grep. – Daniel

Respuesta

7

No sé por qué cada uno() no funciona para usted:

ROTO - ver FIX ABAJO

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; 
} 

ejemplo adicional para comentarios 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); 

Ok, mi primer ejemplo es HORKED. Señalado a mí después de unos 6 meses y múltiples votaciones ascendentes. :)

correctamente, cheque() debe tener este aspecto:

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; 
} 

La razón aquí es bastante simple ... el alcance de la declaración era simplemente incorrecto.

Al menos la versión de prototipo de objeto (la que realmente comprobé) funcionó.

Gracias Crashalot. Mi error.

+0

Probablemente usó '$ (arr) .each()' – ThiefMaster

+1

Gracias por esto. En realidad estaba buscando una función como Array y me gusta la función que escribí arriba que no me haría crear una función como la que acaba de crear. Entonces para aclarar mi identidad hay una función integrada que hace lo que hace tu función. Pero tal vez estoy buscando demasiado lejos. – Daniel

+0

Sí. En realidad, no me gusta eso de jQuery ... los nombres están demasiado sobrecargados. Por supuesto, el otro lado de esa moneda es algo así como PHP con sus cientos de funciones de nivel superior sin nombre de espacio. –

Cuestiones relacionadas