Am urmatoarea matrice JavaScript de origine imobiliare obiecte:
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;
Ceea ce aș vrea să fac este să fie capabil de a efectua un filtru pe obiect pentru a reveni un subset de "home" obiecte.
De exemplu, vreau să fie în măsură de a filtra în funcție de: prețul
, mp
, num_of_beds", și " num_of_baths
.
Cum pot efectua ceva in JavaScript ca pseudo-codul de mai jos:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Rețineți, sintaxa nu trebuie să fie exact ca mai sus. Acesta este doar un exemplu.
Puteți utiliza Matrice.prototip.filtru
metoda:
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 Exemplu:
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);
Această metodă este o parte din noi ECMAScript 5-a Ediție standard, și pot fi găsite pe aproape toate browserele moderne.
De EXEMPLU, puteți include următoarele metode de compatibilitate:
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;
};
}
Puteți încerca să utilizați cadru ca jLinq - următorul este un exemplu de cod de utilizarea jLinq
var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();
Pentru mai multe informații, aveți posibilitatea să urmați link-ul http://www.hugoware.net/projects/jlinq
Prefer Subliniere cadru. Se sugerează de multe utile operațiuni cu obiecte. Sarcina ta:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5);
poate fi overwriten, cum ar fi:
var newArray = _.filter (homes, function(home) {
return home.price<=1000 && sqft>=500 && num_of_beds>=2 && num_of_baths>=2.5;
});
Sper că va fi util pentru tine!
aici este de lucru vioara care funcționează bine în IE8 folosind jquery funcția HARTĂ
json.HOMES = $.map(json.HOMES, function(val, key) {
if (Number(val.price) <= 1000
&& Number(val.sqft) >= 500
&& Number(val.num_of_beds) >=2
&& Number(val.num_of_baths ) >= 2.5)
return val;
});
Ai putea face acest lucru destul de ușor - există, probabil, multe implementari puteți alege de la, dar aceasta este ideea de bază (și există, probabil, un format în care puteți repeta peste un obiect cu jQuery, eu doar cant cred că de acum):
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;
}
Și atunci ai putea invoca această funcție astfel:
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;
});
În acest fel, puteți invoca filtru bazat pe orice predicat definiți, sau filtra chiar de mai multe ori, folosind filtre mai mici.
Am'm a surprins ca nimeni nu a postat-o linie de răspuns:
const filteredHomes = json.homes.filter(x => x.price <= 1000 && x.sqft >= 500 && x.num_of_beds >=2 && x.num_of_baths >= 2.5);
...și doar astfel încât să puteți citi mai ușor:
const filteredHomes = json.homes.filter( x =>
x.price <= 1000 &&
x.sqft >= 500 &&
x.num_of_beds >=2 &&
x.num_of_baths >= 2.5
);
Puteți pune în aplicare un filtru metodă care satisface nevoile dumneavoastra, iată cum:
function myfilter(array, test){
var passedTest =[];
for (var i = 0; i < array.length; i++) {
if(test( array[i]))
passedTest.push(array[i]);
}
return passedTest;
}
var passedHomes = myfilter(homes,function(currentHome){
return ((currentHome.price <= 1000 )&& (currentHome.sqft >= 500 )&&(currentHome.num_of_beds >=2 )&&(currentHome.num_of_baths >= 2.5));
});
Sper, ajută!
Ar trebui să verificați OGX.List, care a construit în metode de filtrare și se extinde standard javascript array (și, de asemenea, gruparea, sortarea și găsirea). Aici's o listă a operatorilor acesta susține pentru filtre:
'eq' //Equal to
'eqjson' //For deep objects, JSON comparison, equal to
'neq' //Not equal to
'in' //Contains
'nin' //Doesn't contain
'lt' //Lesser than
'lte' //Lesser or equal to
'gt' //Greater than
'gte' //Greater or equal to
'btw' //Between, expects value to be array [_from_, _to_]
'substr' //Substring mode, equal to, expects value to be array [_from_, _to_, _niddle_]
'regex' //Regex match
Puteți folosi acest mod
let list = new OGX.List(your_array);
list.addFilter('price', 'btw', 100, 500);
list.addFilter('sqft', 'gte', 500);
let filtered_list = list.filter();
Sau chiar de acest fel
let list = new OGX.List(your_array);
let filtered_list = list.get({price:{btw:[100,500]}, sqft:{gte:500}});
Sau ca o linie
let filtered_list = new OGX.List(your_array).get({price:{btw:[100,500]}, sqft:{gte:500}});
Sau puteți folosi pur și simplu $.fiecare
(care, de asemenea, funcționează pentru obiecte, nu numai tablouri) și de a construi o nouă matrice astfel:
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) ...
{
"home_id": "3-will-be-matched",
"price": "925",
"sqft": "1000",
"num_of_beds": "2",
"num_of_baths": "2.5",
},
]
}
var homes = [];
$.each(json.homes, function(){
if (this.price <= 1000
&& this.sqft >= 500
&& this.num_of_beds >= 2
&& this.num_of_baths >= 2.5
) {
homes.push(this);
}
});
var filterHome = homes.filter(home =>
return (home.price <= 999 &&
home.num_of_baths >= 2.5 &&
home.num_of_beds >=2 &&
home.sqft >= 998));
console.log(filterHome);
Puteți utiliza această funcție lambda. Mai multe detalii pot fi găsite aici, deoarece suntem filtrarea datelor bazate pe ai condiție care returnează true sau false și se va colecta date în diferite matrice deci efectiv matrice va fi modificat.
@JGreig vă Rugăm să se uite în ea.
Eu folosesc mi `ruleOut funcția pentru obiecte de filtrare bazat pe specifice nedorite valorile de proprietate. Am înțeles că, în exemplul tău doriți să utilizați condițiile în loc de valori, dar raspunsul meu este valabil pentru întrebarea din titlu, așa că am'd place să-mi las metoda de aici.
function ruleOut(arr, filterObj, applyAllFilters=true) {
return arr.filter( row => {
for (var field in filterObj) {
var val = row[field];
if (val) {
if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;
else if (!applyAllFilters) {
return filterObj[field].filter(function(filterValue){
return (val.indexOf(filterValue)>-1);
}).length == 0;
}
}
}
return true;
});
}
Spune că ai o listă de actori de genul asta:
let actors = [
{userName:"Mary", job:"star", language:"Turkish"},
{userName:"John", job:"actor", language:"Turkish"},
{userName:"Takis", job:"star", language:"Greek"},
{userName:"Joe", job:"star", language:"Turkish"},
{userName:"Bill", job:"star", language:"Turkish"}
];
și-ar dori să găsească toți actorii care sunt apreciate ca Holywood stele, naționalitatea lor nu ar trebui să fie una din 'engleză', 'Italian', 'spaniol', 'greacă', plus numele lor nu ar fi una de 'Maria', 'Joe'. Bizzar exemplu, știu! Oricum, cu acest set de condiții le-ar crea următorul obiect:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
OK, acum daca ai ruleOut(actori, unwantedFieldsFilter)` te-ai
[{userName: "Lege", de locuri de muncă: "steaua", limba: "turcesc"}]
Și Bill este omul tău, deoarece numele său nu este unul dintre 'Maria', 'Joe', de naționalitate nu este inclus în ['engleză', 'Italian', 'spaniol', 'greacă'] în plus, el este un Star!
Există o opțiune în metoda mea, care este applyAllFilters
și este adevărat în mod implicit.
Dacă ar încerca să ruleOut cu acest parametru setat ca false, care ar funcționa ca un 'SAU' de filtrare în loc de 'SI'.
Exemplu: ruleOut(actori, {loc de muncă:["actorul"], language:["Italian"]}, false)
ar toată lumea că nu este un actor sau Italian:
[{userName: "Maria", de locuri de muncă: "steaua", limba: "turcesc"},
{userName: "Takis", de locuri de muncă: "steaua", limba: "greacă"},
{userName: "Joe", de locuri de muncă: "steaua", limba: "turcesc"},
{userName: "Lege", de locuri de muncă: "steaua", limba: "turcesc"}]