Saya memiliki array seperti
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Bagaimana cara memeriksa array ini untuk melihat apakah Magenic ada? Saya tidak ingin mengulang, kecuali saya harus melakukannya. Saya sedang bekerja dengan beberapa ribu catatan yang berpotensi.
DIPERBARUI
Karena ini adalah posting yang populer, saya pikir saya akan membagikan sesuatu yang baru yang saya temukan. Dan tampaknya @CAFxX telah membagikan ini! Saya harus membaca ini lebih sering. Saya menemukan https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
Dan dengan ECMAScript 2015 bahkan lebih mudah menggunakan fungsi panah baru:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
sumber
sumber
Jawaban:
Sunting 2018 : Jawaban ini dari 2011, sebelum browser secara luas mendukung metode penyaringan array dan fungsi panah. Silahkan lihat pada jawaban CAFxX ini .
Tidak ada cara "ajaib" untuk memeriksa sesuatu dalam array tanpa loop. Bahkan jika Anda menggunakan beberapa fungsi, fungsi itu sendiri akan menggunakan loop. Apa yang dapat Anda lakukan adalah keluar dari loop segera setelah Anda menemukan apa yang Anda cari untuk meminimalkan waktu komputasi.
sumber
'Magenic'
ada di tempat lain di objekTidak perlu menemukan kembali
rodalingkaran, setidaknya tidak secara eksplisit (menggunakan fungsi panah , hanya browser modern ):atau, lebih baik lagi :
EDIT: Jika Anda memerlukan kompatibilitas dengan browser yang buruk maka taruhan terbaik Anda adalah:
sumber
some
dapat korsleting sekali objek denganname === "Magenic"
ditemukan. Denganfilter
, itu akan memeriksa setiap item sampai akhir array dan membuat item array baru yang cocok dengan kondisi, lalu periksalength
Tidak perlu loop. Tiga metode yang muncul di pikiran:
Array.prototype.some ()
Ini adalah jawaban paling tepat untuk pertanyaan Anda, yaitu "periksa apakah ada sesuatu", menyiratkan hasil bool. Ini akan benar jika ada benda 'Magenic', false jika tidak:
Array.prototype.filter ()
Ini akan mengembalikan array dari semua objek 'Magenic', bahkan jika hanya ada satu (akan mengembalikan array satu elemen):
Jika Anda mencoba memaksa ini ke boolean, itu tidak akan berfungsi, karena array kosong (tidak ada objek 'Magenic') masih benar. Jadi gunakan saja
magenicVendors.length
dalam kondisi Anda.Array.prototype.find ()
Ini akan mengembalikan objek 'Magenic' pertama (atau
undefined
jika tidak ada):Ini memaksa boolean oke (objek apa pun adalah benar,
undefined
salah).Catatan: Saya menggunakan vendor ["Nama"] alih-alih vendor. Nama karena casing aneh dari nama properti.
Catatan 2: Tidak ada alasan untuk menggunakan kesetaraan longgar (==) alih-alih kesetaraan yang ketat (===) saat memeriksa nama.
sumber
Jawaban yang diterima masih berfungsi tetapi sekarang kami memiliki metode asli ECMAScript 6
[Array.find][1]
untuk mencapai efek yang sama.Mengutip MDN:
Lihat tautan jsfiddle saya. Ada polyfill untuk IE yang disediakan oleh mozilla
sumber
return ele.id == '2'
, tetapi memberi +1 untuk solusi ES6 yang baik.push if <0 || splice(index, 1)
sini adalah kode saya yang sedikit diperbarui:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Begini cara saya akan melakukannya
array.some()
Metode memeriksa apakah ada setidaknya satu nilai dalam array yang cocok dengan kriteria dan mengembalikan boolean. Dari sini Anda dapat pergi dengan:sumber
Kecuali jika Anda ingin merestrukturisasi seperti ini:
yang dapat Anda lakukan
if(vendors.Magnetic)
Anda harus mengulang
sumber
Sesuai spesifikasi ECMAScript 6, Anda dapat menggunakan
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
akan menahan0
(yang merupakan indeks dalam array) atau-1
jika tidak ditemukan.sumber
Karena OP telah mengajukan pertanyaan apakah kuncinya ada atau tidak .
Solusi yang lebih elegan yang akan mengembalikan boolean menggunakan fungsi pengurangan ES6
Catatan: Parameter awal pengurangan adalah a
false
dan jika array memiliki kunci, itu akan mengembalikan true.Semoga ini membantu untuk implementasi kode yang lebih baik dan lebih bersih
sumber
reduce
adalah akumulator dan bukanvendor
objek. Ini memeriksafalse.Name === "Magenic"
setiap loop dan mengembalikan falseAnda tidak bisa tanpa melihat ke objek sebenarnya.
Anda mungkin harus sedikit mengubah struktur Anda
Maka Anda bisa menggunakannya seperti pencarian-hash.
sumber
Mungkin sudah terlambat, tetapi array javascript memiliki dua metode
some
danevery
metode yang mengembalikan boolean dan dapat membantu Anda mencapainya.Saya pikir
some
akan paling tepat untuk apa yang ingin Anda capai.Beberapa memvalidasi bahwa salah satu objek dalam array memenuhi kondisi yang diberikan.
Setiap memvalidasi bahwa semua objek dalam array memenuhi kondisi yang diberikan.
sumber
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
itu harus benarsome
, akan memperbarui jawaban saya.Anda harus mengulang, tidak ada jalan lain.
Tentu saja Anda bisa menggunakan perpustakaan seperti linq.js untuk menjadikan ini lebih menyenangkan:
(lihat jsFiddle untuk demo)
Saya ragu linq.js akan lebih cepat daripada loop lurus ke depan, tetapi tentu saja lebih fleksibel ketika segala sesuatunya menjadi sedikit lebih rumit.
sumber
Menguji elemen array:
JS Menawarkan fungsi array yang memungkinkan Anda untuk mencapai hal ini dengan relatif mudah. Mereka adalah sebagai berikut:
Array.prototype.filter
: Mengambil fungsi panggilan balik yang merupakan tes, array kemudian diulang dengan panggilan balik dan difilter menurut panggilan balik ini. Array baru yang difilter dikembalikan.Array.prototype.some
: Mengambil fungsi panggilan balik yang merupakan tes, array kemudian diulangi dengan panggilan balik dan jika ada elemen yang lulus tes, boolean true dikembalikan. Kalau tidak salah dikembalikanSpesifik dijelaskan dengan baik melalui contoh:
Contoh:
Dukungan browser:
2 fungsi ini
ES6
berfungsi, tidak semua browser mungkin mendukungnya. Untuk mengatasinya Anda bisa menggunakan polyfill. Ini adalah polyfill untukArray.prototype.some
(dari MDN):sumber
jika Anda menggunakan jquery, Anda dapat memanfaatkan grep untuk membuat array dengan semua objek yang cocok:
dan kemudian gunakan array hasil:
sumber
Perbaiki saya jika saya salah .. saya bisa menggunakan
forEach
metode seperti ini,Saat ini saya sudah terbiasa dengan itu, karena kesederhanaan dan kata yang jelas. Terima kasih.
sumber
Anda dapat mencoba ini untuk saya.
sumber
Anda bisa menggunakan lodash . Jika lodash library terlalu berat untuk aplikasi Anda, pertimbangkan untuk tidak menggunakan fungsi yang tidak perlu.
Ini hanya satu cara untuk melakukan ini. Yang lain bisa:
console.log(arr);
Contoh di atas juga dapat ditulis ulang tanpa menggunakan perpustakaan seperti:
Semoga jawaban saya membantu.
sumber
Banyak jawaban di sini baik dan sangat mudah. Tetapi jika array objek Anda memiliki set nilai yang tetap maka Anda dapat menggunakan trik di bawah ini:
Petakan semua nama dalam suatu objek.
Sekarang dirtyObj ini dapat Anda gunakan berulang kali tanpa loop.
sumber
Untuk membandingkan satu objek dengan yang lain, saya menggabungkan for in loop (digunakan untuk mengulang objek) dan some (). Anda tidak perlu khawatir tentang keluar array batas dll, sehingga menghemat beberapa kode. Dokumentasi tentang .beberapa dapat ditemukan di sini
Cara alternatif saya membandingkan satu objek dengan yang lain adalah dengan menggunakan nested for loop dengan Object.keys (). Length untuk mendapatkan jumlah objek dalam array. Kode di bawah ini:
Untuk menjawab pertanyaan persis Anda, jika hanya mencari nilai dalam suatu objek, Anda bisa menggunakan satu untuk di dalam loop.
sumber
Atau Anda dapat melakukannya:
sumber
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Contoh:without2([{id:1},{id:1},{id:2}],{id:2})
Hasil: tanpa2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
sumber
sumber
Pendekatan saya untuk memecahkan masalah ini adalah menggunakan ES6 dan membuat fungsi yang memeriksa kami. Manfaat dari fungsi ini adalah dapat digunakan kembali di seluruh proyek Anda untuk memeriksa berbagai objek yang diberikan
key
danvalue
untuk diperiksa.BICARA CUKUP, LET'S SEE KODE
Himpunan
Fungsi
Panggilan / Penggunaan
sumber
Saya lebih suka pergi dengan regex.
Jika kode Anda adalah sebagai berikut,
saya ingin merekomendasikan
sumber