Saya memiliki array JavaScript objek rumah real estat berikut:
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 ingin saya lakukan adalah dapat melakukan filter pada objek untuk mengembalikan subset objek "home".
Sebagai contoh, saya ingin dapat menyaring berdasarkan: price
, sqft
, num_of_beds
, dan num_of_baths
.
Bagaimana saya bisa melakukan sesuatu dalam 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 persis seperti di atas. Ini hanya sebuah contoh.
javascript
JGreig
sumber
sumber
var json = { ... }
JSON adalah notasi tekstual untuk pertukaran data. (Lebih lanjut di sini.) Jika Anda berurusan dengan kode sumber JavaScript, dan tidak berurusan dengan string , Anda tidak berurusan dengan JSON.Jawaban:
Anda dapat menggunakan
Array.prototype.filter
metode ini:Contoh Langsung:
Tampilkan cuplikan kode
Metode ini adalah bagian dari ECMAScript 5th Edition yang baru , dan dapat ditemukan di hampir semua browser modern.
Untuk IE, Anda dapat menyertakan metode kompatibilitas berikut:
sumber
Array.prototype.filter.length == 1;
). Saat Anda menggunakan argumen kedua, argumen itu akan digunakan sebagaithis
nilai di dalam fungsi panggilan balik.Anda dapat mencoba menggunakan kerangka kerja seperti jLinq - berikut ini adalah contoh kode menggunakan jLinq
Untuk informasi lebih lanjut, Anda dapat mengikuti tautan http://www.hugoware.net/projects/jlinq
sumber
Saya lebih suka kerangka garis bawah. Ini menyarankan banyak operasi berguna dengan objek. Tugas Anda:
dapat ditimpa seperti:
Semoga bermanfaat bagi Anda!
sumber
underscore-query
( github.com/davidgtonge/underscore-query ) yang menggunakan sintaksiseperti MongoDB untuk menanyakan array javascript. Jadi di sini Anda akan menggunakan_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Saya terkejut tidak ada yang mengirim respons satu baris:
... dan agar Anda dapat membacanya dengan lebih mudah:
sumber
di sini adalah biola yang berfungsi dengan baik di IE8 menggunakan fungsi jquery MAP
http://jsfiddle.net/533135/Cj4j7/
sumber
Anda dapat menggunakan jQuery.grep () karena jQuery 1.0:
sumber
Anda dapat melakukan ini dengan cukup mudah - mungkin ada banyak implementasi yang dapat Anda pilih, tetapi ini adalah ide dasar saya (dan mungkin ada beberapa format di mana Anda dapat beralih pada objek dengan jQuery, saya tidak bisa memikirkannya sekarang):
Dan kemudian Anda bisa menjalankan fungsi ini seperti:
Dengan cara ini, Anda dapat menjalankan filter berdasarkan predikat apa pun yang Anda tetapkan, atau bahkan memfilter beberapa kali menggunakan filter yang lebih kecil.
sumber
Anda dapat menerapkan metode filter sendiri yang memenuhi kebutuhan Anda, berikut ini caranya:
Semoga bermanfaat!
sumber
Anda harus memeriksa OGX.List yang memiliki metode penyaringan bawaan dan memperluas javascript array standar (dan juga pengelompokan, pengurutan dan pencarian). Berikut daftar operator yang didukung untuk filter:
Anda bisa menggunakannya dengan cara ini
Atau bahkan dengan cara ini
Atau sebagai satu liner
sumber
Atau Anda cukup menggunakan
$.each
(yang juga berfungsi untuk objek, tidak hanya array) dan membangun array baru seperti:sumber
Saya menggunakan
ruleOut
fungsi saya untuk memfilter objek berdasarkan nilai properti spesifik yang tidak diinginkan. Saya memahami bahwa dalam contoh Anda, Anda ingin menggunakan kondisi alih-alih nilai, tetapi jawaban saya valid untuk judul pertanyaan, jadi saya ingin meninggalkan metode saya di sini.Katakanlah Anda memiliki daftar aktor seperti ini:
dan Anda ingin menemukan semua aktor yang dinilai sebagai bintang Holywood, kewarganegaraan mereka tidak boleh salah satu dari 'Inggris', 'Italia', 'Spanyol', 'Yunani', ditambah nama mereka tidak akan menjadi salah satu dari 'Mary', 'Joe'. Contoh Bizzar, saya tahu! Lagi pula, dengan serangkaian kondisi tersebut Anda akan membuat objek berikut:
OK, sekarang jika Anda
ruleOut(actors, unwantedFieldsFilter)
hanya akan mendapatkannyaDan Bill adalah laki-laki Anda, karena namanya bukan salah satu dari 'Mary', 'Joe', kewarganegaraannya tidak termasuk dalam ['Inggris', 'Italia', 'Spanyol', 'Yunani'] plus ia seorang Bintang!
Ada satu opsi dalam metode saya, yaitu
applyAllFilters
dan benar secara default. Jika Anda akan mencoba untuk ruleOut dengan param ini diset sebagai false, itu akan berfungsi sebagai pemfilteran 'ATAU' dan bukannya 'DAN'. Contoh:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
akan membuat Anda semua orang yang bukan aktor atau Italia:sumber
Anda dapat menggunakan fungsi lambda ini. Lebih detail dapat ditemukan di sini karena kami memfilter data berdasarkan Anda memiliki kondisi yang mengembalikan benar atau salah dan itu akan mengumpulkan data dalam array yang berbeda sehingga array Anda yang sebenarnya tidak akan dimodifikasi.
@ JGreig Silakan lihat.
sumber
sumber
sumber