2011-06-04 26 views
16
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}]; 

Me gustaría poder hacer algo como una llamada a base de datos, set.find({"color":"green"}) y hacer que devuelva una matriz llena de objetos que contienen esa propiedad.¿Encontrar objetos coincidentes en una matriz de objetos?

+1

ya ha respondido en http://stackoverflow.com/questions/1820593/search-a-javascript-object –

+0

Ese ejemplo no devuelve el objeto entero , ¿lo hace? – fancy

+1

Esto no tiene nada que ver con jQuery, por lo que debe eliminar esa etiqueta. Es una pregunta puramente JavaScript. – Domenic

Respuesta

38

Usando Array#filter, para este caso particular, el código se vería así

var results = set.filter(function (entry) { return entry.color === "green"; }); 

Array#filter no está implementado en algunos navegadores antiguos, por lo que ver el artículo enlazado por una cuña compatibilidad hacia atrás, o mejor aún obtener a full-fledged ES5 shim.

Para el caso más general, es sólo una cuestión de extender esta idea:

function findByMatchingProperties(set, properties) { 
    return set.filter(function (entry) { 
     return Object.keys(properties).every(function (key) { 
      return entry[key] === properties[key]; 
     }); 
    }); 
} 

var results = findByMatchingProperties(set, { color: "green" }); 

Una vez más, estoy utilizando ECMAScript 5 métodos Object.keys y Array#every, a fin de utilizar una cuña ES5. (. El código es factible sin una cuña ES5 pero utiliza bucles manuales y es mucho menos divertido de escribir y leer)

+0

No me importa usar ES5 puro, esto está en el servidor. – fancy

+4

Aún más raro que esté incluyendo la etiqueta jQuery entonces. – Domenic

+0

¿Cómo se vería esto como un método? set.find ({color: "green"}), básicamente buscando crear una funcionalidad falsa de db. – fancy

2

Desde que ha incluido la etiqueta de jQuery, aquí hay una manera de hacerlo utilizando jQuery map:

var results = $.map(set, function(e,i){ 
    if(e.color === 'green') return e; 
}); 

La documentación indica que debe devolver null para eliminar el elemento de la matriz, pero aparentemente esto es falso, como lo muestra el jsFiddle en los comentarios; no devolver nada (es decir, devolver undefined) funciona igual de bien.

+1

Esto devolverá '[undefined, {color:" green "}, undefined, undefined]'. – Domenic

+0

@Domenic, http://jsfiddle.net/redler/FXRf8/ –

+1

@Ken Redler, soy corregido. La documentación para '$ .map' dice que solo eliminará el elemento si devuelve' null', pero supongo que también reconoce 'undefined'. Aún así, creo que normalmente querrías usar '$ .grep' para esto. – Domenic

0

He utilizado la función de mapa de jquery y estoy obteniendo índice al pasar el valor clave buscado, así que al usar ese índice obtendremos el objeto requerido de la matriz.

var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }]; 

searchKey = 2 

var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }]; 
 

 
searchKey = 2 
 

 
var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)]; 
 

 
console.log(selectedData)

var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)]; 

console.log(selectedData) 

output 
{ name: "Shyam", Id: 2 } 

Note: if you want to pass search key as object then 
searchKey = { Id: 2 }; 

mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey.Id)]; 

output 
{ name: "Shyam", Id: 2 }