Tengo la siguiente matriz de JavaScript de objetos de inicio de bienes raíces:
var json = {
'homes': [{
"home_id": "1",
"price": "925",
"sqft": "1100",
"num_of_beds": "2",
"num_of_baths": "2.0",
}, {
"home_id": "2",
"price": "1425",
"sqft": "1900",
"num_of_beds": "4",
"num_of_baths": "2.5",
},
// ... (more homes) ...
]
}
var xmlhttp = eval('(' + json + ')');
homes = xmlhttp.homes;
Lo que me gustaría hacer es poder realizar un filtro en el objeto para devolver un subconjunto de objetos "de inicio".
Por ejemplo, quiero ser capaz de filtro basado en: price
, sqft
, num_of_beds
, y num_of_baths
.
¿Cómo puedo realizar algo en JavaScript como el pseudocódigo siguiente?
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Tenga en cuenta que la sintaxis no tiene que ser exactamente como la anterior. Esto es solo un ejemplo.
javascript
JGreig
fuente
fuente
var json = { ... }
JSON es una notación textual para el intercambio de datos. (Más información aquí.) Si se trata de código fuente JavaScript y no se trata de una cadena , no se trata de JSON.Respuestas:
Puedes usar el
Array.prototype.filter
método:Ejemplo en vivo:
Mostrar fragmento de código
Este método es parte del nuevo estándar ECMAScript 5th Edition y se puede encontrar en casi todos los navegadores modernos.
Para IE, puede incluir el siguiente método de compatibilidad:
fuente
Array.prototype.filter.length == 1;
). Cuando use el segundo argumento, se usará como elthis
valor dentro de la función de devolución de llamada.Puede intentar usar un marco como jLinq: a continuación se muestra un código de muestra del uso de jLinq
Para obtener más información, puede seguir el enlace http://www.hugoware.net/projects/jlinq
fuente
Prefiero el marco de subrayado. Sugiere muchas operaciones útiles con objetos. Tu tarea:
se puede sobrescribir como:
¡Espero que te sea útil!
fuente
underscore-query
( github.com/davidgtonge/underscore-query ) que usa una sintaxis similar a MongoDB para consultar matrices javascript. Así que aquí usarías_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Me sorprende que nadie haya publicado la respuesta de una línea:
... y para que puedas leerlo más fácilmente:
fuente
Aquí está el violín de trabajo que funciona bien en IE8 usando la función jquery MAP
http://jsfiddle.net/533135/Cj4j7/
fuente
Puede usar jQuery.grep () desde jQuery 1.0:
fuente
Podría hacerlo con bastante facilidad: probablemente hay muchas implementaciones entre las que puede elegir, pero esta es mi idea básica (y probablemente haya algún formato en el que pueda iterar sobre un objeto con jQuery, simplemente no puedo pensar en eso ahora):
Y luego podría invocar esta función así:
De esta manera, puede invocar el filtro en función del predicado que defina, o incluso filtrar varias veces utilizando filtros más pequeños.
fuente
Puede implementar un método de filtro usted mismo que satisfaga sus necesidades, así es como:
¡Espero eso ayude!
fuente
Debe consultar OGX.List, que ha incorporado métodos de filtrado y extiende la matriz estándar de JavaScript (y también la agrupación, clasificación y búsqueda). Aquí hay una lista de operadores que admite para los filtros:
Puedes usarlo de esta manera
O incluso de esta manera
O como un trazador de líneas
fuente
O simplemente puede usar
$.each
(que también funciona para objetos, no solo matrices) y construir una nueva matriz de esta manera:fuente
Uso mi
ruleOut
función para filtrar objetos basados en valores de propiedad no deseados específicos. Entiendo que en su ejemplo le gustaría usar condiciones en lugar de valores, pero mi respuesta es válida para el título de la pregunta, por lo que me gustaría dejar mi método aquí.Digamos que tiene una lista de actores como este:
y le gustaría encontrar a todos los actores calificados como estrellas de Holywood, su nacionalidad no debe ser una de 'inglés', 'italiano', 'español', 'griego', además su nombre no sería una de 'Mary', 'Joe'. Bizzar ejemplo, lo sé! De todos modos, con ese conjunto de condiciones crearía el siguiente objeto:
Bien, ahora si
ruleOut(actors, unwantedFieldsFilter)
solo tuvieras¡Y Bill es tu hombre, ya que su nombre no es uno de 'Mary', 'Joe', su nacionalidad no está incluida en ['inglés', 'italiano', 'español', 'griego'] y además es una estrella!
Hay una opción en mi método, que es
applyAllFilters
y es verdadera por defecto. Si intentara descartar con este parámetro configurado como falso, funcionaría como un filtro 'OR' en lugar de 'AND'. Ejemplo:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
te llevaría a todos los que no sean actores o italianos:fuente
Puedes usar esta función lambda. Puede encontrar más detalles aquí ya que estamos filtrando los datos en función de su condición que devuelve verdadero o falso y recopilará los datos en una matriz diferente para que su matriz real no se modifique.
@JGreig Por favor, míralo.
fuente
fuente
fuente