J'ai le tableau JavaScript suivant des objets immobiliers à la maison:
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;
Ce que je voudrais faire, c'est pouvoir effectuer un filtre sur l'objet pour renvoyer un sous-ensemble d'objets "home".
Par exemple, je veux être en mesure de filtrer en fonction: price
, sqft
, num_of_beds
et num_of_baths
.
Comment puis-je effectuer quelque chose en JavaScript comme le pseudo-code ci-dessous:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Notez que la syntaxe ne doit pas être exactement comme ci-dessus. C'est juste un exemple.
javascript
JGreig
la source
la source
var json = { ... }
JSON est une notation textuelle pour l'échange de données. (Plus ici.) Si vous traitez avec du code source JavaScript et non avec une chaîne , vous ne traitez pas avec JSON.Réponses:
Vous pouvez utiliser la
Array.prototype.filter
méthode:Exemple en direct:
Afficher l'extrait de code
Cette méthode fait partie de la nouvelle norme ECMAScript 5e édition , et peut être trouvée sur presque tous les navigateurs modernes.
Pour IE, vous pouvez inclure la méthode de compatibilité suivante:
la source
Array.prototype.filter.length == 1;
). Lorsque vous utilisez le deuxième argument, il sera utilisé commethis
valeur dans la fonction de rappel.Vous pouvez essayer d'utiliser un framework comme jLinq - voici un exemple de code d'utilisation de jLinq
Pour plus d'informations, vous pouvez suivre le lien http://www.hugoware.net/projects/jlinq
la source
Je préfère le cadre Underscore. Il suggère de nombreuses opérations utiles avec des objets. Ta tâche:
peut être écrasé comme:
J'espère que cela vous sera utile!
la source
underscore-query
( github.com/davidgtonge/underscore-query ) qui utilise une syntaxe de type MongoDB pour interroger les tableaux javascript. Donc, ici, vous utiliseriez_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Je suis surpris que personne n'ait publié la réponse en ligne:
... et pour que vous puissiez le lire plus facilement:
la source
voici le violon qui fonctionne bien dans IE8 en utilisant la fonction jquery MAP
http://jsfiddle.net/533135/Cj4j7/
la source
Vous pouvez utiliser jQuery.grep () depuis jQuery 1.0:
la source
Vous pouvez le faire assez facilement - il y a probablement de nombreuses implémentations parmi lesquelles vous pouvez choisir, mais c'est mon idée de base (et il y a probablement un format où vous pouvez parcourir un objet avec jQuery, je ne peux pas y penser en ce moment):
Et puis vous pouvez invoquer cette fonction comme ceci:
De cette façon, vous pouvez invoquer le filtre en fonction du prédicat que vous définissez, ou même filtrer plusieurs fois à l'aide de filtres plus petits.
la source
Vous pouvez implémenter vous-même une méthode de filtrage qui répond à vos besoins, voici comment:
J'espère que cela aide!
la source
Vous devriez vérifier OGX.List qui a intégré des méthodes de filtrage et étend le tableau javascript standard (ainsi que le regroupement, le tri et la recherche). Voici une liste des opérateurs qu'il prend en charge pour les filtres:
Vous pouvez l'utiliser de cette façon
Ou même de cette façon
Ou comme un liner
la source
Ou vous pouvez simplement utiliser
$.each
(qui fonctionne également pour les objets, pas seulement les tableaux) et créer un nouveau tableau comme ceci:la source
J'utilise ma
ruleOut
fonction pour filtrer les objets en fonction de valeurs de propriétés indésirables spécifiques. Je comprends que dans votre exemple, vous souhaitez utiliser des conditions au lieu de valeurs, mais ma réponse est valide pour le titre de la question, je voudrais donc laisser ma méthode ici.Disons que vous avez une liste d'acteurs comme celui-ci:
et vous souhaitez trouver tous les acteurs qui sont considérés comme des stars de Holywood, leur nationalité ne doit pas être «anglais», «italien», «espagnol», «grec», plus leur nom ne doit pas être «Mary», «Joe». Exemple Bizzar, je sais! Quoi qu'il en soit, avec cet ensemble de conditions, vous créeriez l'objet suivant:
OK, maintenant si vous
ruleOut(actors, unwantedFieldsFilter)
vousEt Bill est votre homme, puisque son nom n'est pas celui de 'Mary', 'Joe', sa nationalité n'est pas incluse dans ['Anglais', 'Italien', 'Espagnol', 'Grec'] plus c'est une Star!
Il y a une option dans ma méthode, c'est
applyAllFilters
et c'est vrai par défaut. Si vous tentiez de faire un ruleOut avec ce paramètre défini comme faux, cela fonctionnerait comme un filtrage «OU» au lieu de «ET». Exemple:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
vous obtiendrez tout le monde qui n'est pas un acteur ou un italien:la source
Vous pouvez utiliser cette fonction lambda. Plus de détails peuvent être trouvés ici car nous filtrons les données en fonction de votre condition qui retourne vrai ou faux et il collectera les données dans un tableau différent afin que votre tableau ne soit pas modifié.
@JGreig Veuillez l'examiner.
la source
la source
la source