Man ir šāds JavaScript masīvs ar nekustamā īpašuma mājas objektiem:
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;
Es gribētu, lai objektam varētu veikt filtru, lai atgrieztu "home" objektu apakškopu.
Piemēram, es gribu, lai varētu filtrēt, pamatojoties uz: cenu
, kvadrātmetru
, gultu
skaitu un vannu
skaitu.
Kā es varu veikt kaut ko līdzīgu turpmāk norādītajam pseidokodam JavaScript:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Ņemiet vērā, ka sintaksei nav jābūt tieši tādai, kā iepriekš. Tas ir tikai piemērs.
Varat izmantot Array.prototipe.filter
metodi:
var newArray = homes.filter(function (el) {
return el.price <= 1000 &&
el.sqft >= 500 &&
el.num_of_beds >=2 &&
el.num_of_baths >= 2.5;
});
Dzīvais piemērs:
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);
Šī metode ir daļa no jaunā ECMAScript 5th Edition standarta, un to var atrast gandrīz visās mūsdienu pārlūkprogrammās.
Lai nodrošinātu savietojamību ar IE, varat iekļaut šādu metodi:
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;
};
}
Varat izmēģināt izmantot tādu sistēmu kā jLinq - zemāk ir jLinq koda paraugs.
var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();
Lai iegūtu vairāk informācijas, varat sekot saitei http://www.hugoware.net/projects/jlinq.
Jūs to varētu izdarīt diezgan viegli - iespējams, ir daudz implementāciju, no kurām varat izvēlēties, bet šī ir mana pamatideja (un, iespējams, ir kāds formāts, kurā jūs varat iterēt pa objektu ar jQuery, es vienkārši nevaru to iedomāties tieši tagad):
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;
}
Un tad jūs varētu izsaukt šo funkciju šādi:
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;
});
Šādā veidā jūs varat izsaukt filtru, pamatojoties uz jebkuru definēto predikātu, vai pat filtrēt vairākas reizes, izmantojot mazākus filtrus.