Ich habe die folgenden JavaScript-Array von Immobilien zu Hause Objekte:
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;
Was ich tun möchte, ist in der Lage sein, einen Filter auf das Objekt durchführen, um eine Teilmenge von "home" Objekte zurück.
Zum Beispiel möchte ich filtern können nach: "Preis", "Quadratmeter", "Anzahl der Betten" und "Anzahl der Bäder".
Wie kann ich in JavaScript etwas wie den folgenden Pseudocode ausführen?
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Beachten Sie, dass die Syntax nicht genau so sein muss wie oben. Dies ist nur ein Beispiel.
Sie können die Methode Array.prototype.filter
verwenden:
var newArray = homes.filter(function (el) {
return el.price <= 1000 &&
el.sqft >= 500 &&
el.num_of_beds >=2 &&
el.num_of_baths >= 2.5;
});
Live-Beispiel:
var obj = {
'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) ...
]
};
// (Note that because `price` and such are given as strings in your object,
// the below relies on the fact that <= and >= with a string and number
// will coerce the string to a number before comparing.)
var newArray = obj.homes.filter(function (el) {
return el.price <= 1000 &&
el.sqft >= 500 &&
el.num_of_beds >= 2 &&
el.num_of_baths >= 1.5; // Changed this so a home would match
});
console.log(newArray);
Diese Methode ist Teil des neuen ECMAScript 5th Edition Standards und ist in fast allen modernen Browsern zu finden.
Für IE können Sie aus Kompatibilitätsgründen die folgende Methode einbinden:
if (!Array.prototype.filter) {
Array.prototype.filter = function(fun /*, thisp*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this) {
var val = this[i];
if (fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
}
Sie können versuchen, ein Framework wie jLinq zu verwenden - im Folgenden finden Sie ein Codebeispiel für die Verwendung von jLinq
var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();
Für weitere Informationen können Sie dem Link http://www.hugoware.net/projects/jlinq folgen.
Sie könnten dies ziemlich leicht tun - es gibt wahrscheinlich viele Implementierungen, die Sie aus wählen können, aber dies ist meine grundlegende Idee (und es gibt wahrscheinlich irgendein Format, wo Sie über ein Objekt mit jQuery iterieren können, ich kippe gerade jetzt daran denken):
function filter(collection, predicate)
{
var result = new Array();
var length = collection.length;
for(var j = 0; j < length; j++)
{
if(predicate(collection[j]) == true)
{
result.push(collection[j]);
}
}
return result;
}
Und dann könnte man diese Funktion wie folgt aufrufen:
filter(json, function(element)
{
if(element.price <= 1000 && element.sqft >= 500 && element.num_of_beds > 2 && element.num_of_baths > 2.5)
return true;
return false;
});
Auf diese Weise können Sie den Filter auf der Grundlage eines von Ihnen definierten Prädikats aufrufen oder sogar mehrere Filter mit kleineren Filtern verwenden.