Turiu tokį "JavaScript" nekilnojamojo turto namų objektų masyvą:
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;
Norėčiau, kad būtų galima atlikti objekto filtrą ir grąžinti "namų" objektų poaibį.
Pavyzdžiui, noriu, kad būtų galima filtruoti pagal: kainą
, kvft
, gultų_skaičių
ir vanų_skaičių
.
Kaip galėčiau atlikti ką nors panašaus į toliau pateiktą pseudokodą "JavaScript":
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Atkreipkite dėmesį, kad sintaksė nebūtinai turi būti tiksliai tokia, kaip pirmiau. Tai tik pavyzdys.
Galite naudoti Array.prototype.filter
metodą:
var newArray = homes.filter(function (el) {
return el.price <= 1000 &&
el.sqft >= 500 &&
el.num_of_beds >=2 &&
el.num_of_baths >= 2.5;
});
Tiesioginis pavyzdys:
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);
Šis metodas yra naujojo ECMAScript 5th Edition standarto dalis ir jį galima rasti beveik visose šiuolaikinėse naršyklėse.
IE naršyklėje suderinamumo sumetimais galite įtraukti šį metodą:
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;
};
}
Galite pabandyti naudoti tokią sistemą kaip jLinq - toliau pateikiamas kodo pavyzdys, kaip naudoti jLinq
var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();
Daugiau informacijos galite rasti paspaudę nuorodą http://www.hugoware.net/projects/jlinq.
Tai galite padaryti gana lengvai - tikriausiai yra daugybė įgyvendinimų, iš kurių galite rinktis, bet tai yra mano pagrindinė idėja (tikriausiai yra koks nors formatas, kuriuo galite iteruoti objektą naudodami jQuery, tik dabar negaliu apie tai pagalvoti):
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;
}
Ir tada šią funkciją galėtumėte iškviesti taip:
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;
});
Tokiu būdu galite iškviesti filtrą pagal bet kokį apibrėžtą predikatą arba net filtruoti kelis kartus, naudodami mažesnius filtrus.