Saya memiliki JavaScript berikut fasilitas real estate rumah benda:
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;
Apa yang saya ingin lakukan adalah dapat melakukan filter pada objek untuk kembali subset dari "rumah" benda-benda.
Sebagai contoh, saya ingin dapat menyaring berdasarkan: harga
, kaki
, num_of_beds
, dan num_of_baths
.
Bagaimana saya bisa melakukan sesuatu di JavaScript seperti pseudo-code di bawah ini:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Catatan, sintaks tidak harus sama persis seperti di atas. Ini adalah hanya sebuah contoh.
Anda dapat menggunakan Array.prototipe.filter
metode:
var newArray = homes.filter(function (el) {
return el.price <= 1000 &&
el.sqft >= 500 &&
el.num_of_beds >=2 &&
el.num_of_baths >= 2.5;
});
Hidup Contoh:
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 ini merupakan bagian dari new ECMAScript 5th Edition standar, dan dapat ditemukan di hampir semua browser modern.
Untuk IE, anda dapat menyertakan metode berikut untuk kompatibilitas:
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;
};
}
Anda dapat mencoba menggunakan framework seperti jLinq - berikut adalah contoh kode menggunakan jLinq
var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();
Untuk informasi lebih lanjut anda dapat mengikuti link http://www.hugoware.net/projects/jlinq
Saya lebih suka Menggarisbawahi framework. Ini menunjukkan banyak operasi yang berguna dengan benda-benda. Tugas anda:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5);
dapat overwriten seperti:
var newArray = _.filter (homes, function(home) {
return home.price<=1000 && sqft>=500 && num_of_beds>=2 && num_of_baths>=2.5;
});
Berharap ini akan berguna bagi anda!
berikut ini adalah kerja biola yang bekerja di IE8 menggunakan jquery fungsi PETA
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;
});
Anda bisa melakukan ini dengan mudah - mungkin ada banyak implementasi yang anda dapat memilih dari, tapi ini adalah ide saya (dan mungkin ada beberapa format di mana anda dapat iterate atas suatu objek dengan jQuery, aku hanya tidak berpikir tentang hal itu sekarang):
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;
}
Dan kemudian anda bisa memanggil fungsi ini seperti berikut:
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;
});
Dengan cara ini, anda dapat memanggil filter berdasarkan pada apa pun predikat yang anda tentukan, atau bahkan menyaring beberapa kali menggunakan filter yang lebih kecil.
I'm terkejut tidak ada yang telah diposting satu respon:
const filteredHomes = json.homes.filter(x => x.price <= 1000 && x.sqft >= 500 && x.num_of_beds >=2 && x.num_of_baths >= 2.5);
...dan agar anda dapat membacanya lebih mudah:
const filteredHomes = json.homes.filter( x =>
x.price <= 1000 &&
x.sqft >= 500 &&
x.num_of_beds >=2 &&
x.num_of_baths >= 2.5
);
Anda dapat menerapkan metode filter sendiri yang memenuhi kebutuhan anda, berikut adalah caranya:
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));
});
Semoga membantu!
Anda harus memeriksa OGX.List yang telah dibangun dalam metode penyaringan dan memperluas standar javascript array (dan juga pengelompokan, pengurutan, dan kota). Berikut ini's daftar operator yang mendukung untuk filter:
'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
Anda dapat menggunakan cara ini
let list = new OGX.List(your_array);
list.addFilter('price', 'btw', 100, 500);
list.addFilter('sqft', 'gte', 500);
let filtered_list = list.filter();
Atau bahkan cara ini
let list = new OGX.List(your_array);
let filtered_list = list.get({price:{btw:[100,500]}, sqft:{gte:500}});
Atau sebagai salah satu kapal
let filtered_list = new OGX.List(your_array).get({price:{btw:[100,500]}, sqft:{gte:500}});
Atau anda hanya dapat menggunakan $.masing-masing
(yang juga bekerja untuk benda-benda, tidak hanya array) dan membangun sebuah array baru seperti:
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);
Anda dapat menggunakan fungsi lambda. Detail lebih lanjut dapat ditemukan di sini karena kita penyaringan data berdasarkan anda memiliki kondisi yang mengembalikan nilai true atau false dan ini akan mengumpulkan data dalam array berbeda jadi anda sebenarnya array akan tidak diubah.
@JGreig Silahkan lihat ke dalamnya.
Saya menggunakan ruleOut
fungsi untuk menyaring benda-benda berdasarkan spesifik yang tidak diinginkan nilai properti. Saya memahami bahwa anda misalnya anda ingin menggunakan kondisi bukan nilai, tapi jawaban saya adalah valid untuk pertanyaan judul, jadi saya'd ingin meninggalkan metode saya di sini.
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;
});
}
Katakanlah anda memiliki daftar aktor seperti ini:
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"}
];
dan anda ingin menemukan semua aktor yang dinilai sebagai bintang Holywood, kebangsaan mereka tidak harus menjadi salah satu dari 'bahasa inggris', 'italia', 'spanyol', 'yunani', plus nama mereka tidak akan salah satu 'Mary', 'Joe'. Bizzar contoh, saya tahu! Toh, dengan kondisi yang akan anda buat objek berikut:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
OK, sekarang jika anda ruleOut(aktor, unwantedFieldsFilter)
anda hanya akan mendapatkan
[{userName: "Bill", pekerjaan: "bintang", bahasa: "turki"}]
Dan Bill adalah laki-laki, karena nama-nya adalah bukan salah satu dari 'Mary', 'Joe', kebangsaannya tidak termasuk dalam ['bahasa inggris', 'italia', 'spanyol', 'yunani'] ditambah dia adalah seorang Bintang!
Ada satu pilihan dalam metode saya, itu adalah applyAllFilters
dan benar secara default.
Jika anda akan mencoba untuk ruleOut dengan param ini ditetapkan sebagai palsu, yang akan bekerja sebagai 'ATAU' penyaringan bukan 'DAN'.
Contoh: ruleOut(aktor, {pekerjaan:["aktor"], bahasa:["italia"]}, false)
akan membuat anda semua orang yang bukan aktor atau italia:
[{userName: "Mary", pekerjaan: "bintang", bahasa: "turki"},
{userName: "Takis", pekerjaan: "bintang", bahasa: "yunani"},
{userName: "Joe", pekerjaan: "bintang", bahasa: "turki"},
{userName: "Bill", pekerjaan: "bintang", bahasa: "turki"}]