Saya perlu menemukan array di mana semua nilai sama. Apa cara tercepat untuk melakukan ini? Haruskah saya mengulanginya dan hanya membandingkan nilai?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
sumber
sumber
a.join(',').split(a[0]).length === a.length + 1
Jawaban:
Atau satu-liner:
Array.prototype.every (dari MDN):
every()
Metode ini menguji apakah semua elemen dalam array lulus tes yang dilaksanakan oleh fungsi yang disediakan.sumber
const everythings_equal = array => array.every(thing => thing === array[0]);
some
bukannyaevery
:arr.some( v => v !== arr[0] )
. Ini akan kembali lebih awal setelah elemen pertama ditemukan tidak setaraarr[0]
.every
tidak kembali lebih awal juga.Sunting: Menjadi seorang ninja Merah:
Hasil:
Peringatan:
Ini karena kami tidak melewati Nilai awal . Jadi, Anda mungkin ingin memeriksa
array.length
dulu.sumber
false
s! misalnya coba [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
mengembalikantrue
: /NaN
. Karena keduanyaNaN === NaN
danNaN !== NaN
salah, itu menjamin bahwa setelahprev
diatur ke NaN maka tidak ada nilai yang bisa mengeluarkannya. Juga menambahkan negasi ganda mengubah hasil menjaditrue
danfalse
, karenaNaN
itu palsu. Bentuk akhir:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Ini bekerja. Anda membuat metode pada Array dengan menggunakan prototipe.
Panggil ini dengan cara ini:
sumber
Array.prototype
baik-baik saja (bahkan IE6). Ini hanya prototipe elemen DOM bahwa beberapa versi IE yang lebih lama tidak mendukung penambahan.allValuesSame
dalam loopDi JavaScript 1.6, Anda dapat menggunakan
Array.every
:Anda mungkin memerlukan beberapa pemeriksaan kewarasan, misalnya ketika array tidak memiliki elemen. (Juga, ini tidak akan berfungsi ketika semua elemen
NaN
sejak ituNaN !== NaN
, tapi itu seharusnya tidak menjadi masalah ... kan?)sumber
Anda dapat mengubah Array menjadi Set. Jika ukuran Set sama dengan 1, maka semua elemen dari Array sama.
sumber
allEqual([NaN, NaN])
memberitrue
dalam kasus ini.Dan untuk perbandingan kinerja saya juga melakukan benchmark:
Hasil:
Jadi ternyata menggunakan builtin array.some () adalah metode tercepat dari yang disampel.
sumber
Array#some
kadang-kadang mengungguli adalah bahwa begitu fungsi callback kembali benar, itu berhenti iterasi. Jadi, jika semua elemen pada kenyataannya sama, kinerja harus identik denganArray#every
. Dan kinerja relatif ketika semua elemen tidak sama akan bervariasi berdasarkan indeks elemen tidak cocok pertama.Jawaban terpendek menggunakan garis bawah / lodash
spec:
edit:
Atau bahkan lebih pendek, terinspirasi oleh jawaban Tom:
spec:
sumber
Jika Anda sudah menggunakan underscore.js , maka inilah opsi lain menggunakan
_.uniq
:_.uniq
mengembalikan versi larik duplikat. Jika semua nilainya sama, maka panjangnya adalah 1.Seperti yang disebutkan dalam komentar, mengingat Anda mungkin mengharapkan array kosong untuk kembali
true
, maka Anda juga harus memeriksa kasus itu:sumber
false
. Sementara saya pikir seharusnya begitutrue
. Mengubah ke.length <= 1
akan cukup.Ya, Anda dapat memeriksanya juga menggunakan filter seperti di bawah ini, sangat sederhana, memeriksa setiap nilai sama dengan yang pertama:
juga dapat dilakukan dengan menggunakan setiap metode pada array:
dan Anda dapat memeriksa array Anda seperti di bawah ini:
Atau Anda dapat menambahkannya ke fungsionalitas Array asli dalam JavaScript jika Anda sering menggunakannya kembali:
dan Anda dapat memeriksa array Anda seperti di bawah ini:
sumber
Anda dapat menggunakan
Array.every
jika didukung:Pendekatan alternatif dari sebuah loop bisa berupa sesuatu
sort
Atau, jika barang seperti pertanyaan, sesuatu yang kotor seperti:
Juga berfungsi.
sumber
equals = !array.some( (v,i,a) => v!==a[0] )
. Kalau tidak, Anda hanya memeriksa bahwa nilai apa pun sama dengan nilai pertama yang, tentu saja, selalu benar :)some
bukannyaevery
seperti yang saya sebutkan di paragraf pertama. :) Terima kasih atas tangkapannya!Anda bisa mendapatkan one-liner ini untuk melakukan apa yang Anda inginkan menggunakan fungsi panah Array.prototype.every , Object.is , dan ES6:
sumber
Saya pikir cara paling sederhana untuk melakukan ini adalah dengan membuat loop untuk membandingkan setiap nilai ke yang berikutnya. Selama ada istirahat dalam "rantai" maka itu akan kembali salah. Jika yang pertama sama dengan yang kedua, yang kedua sama dengan yang ketiga dan seterusnya, maka kita dapat menyimpulkan bahwa semua elemen array sama satu sama lain.
diberi data array [], maka Anda dapat menggunakan:
sumber
sumber
Perbarui solusi baru: periksa indeks
Diperbarui dengan ES6: Penggunaan
list.every
adalah cara tercepat:versi lama:
sumber
Anda bisa menggunakan ini:
Fungsi pertama-tama memeriksa apakah array kosong. Jika itu nilainya sama dengan .. Kalau tidak, filter array dan mengambil semua elemen yang berbeda dari yang pertama. Jika tidak ada nilai seperti itu => array hanya berisi elemen yang sama jika tidak, maka array tersebut tidak.
sumber
_.isEqual(object, other)
Fungsi garis bawah tampaknya berfungsi dengan baik untuk array. Urutan item dalam array penting saat memeriksa kesetaraan. Lihat http://underscorejs.org/#isEqual .sumber
sumber
Itu mudah. Buat fungsi dan berikan parameter. Dalam fungsi itu salin indeks pertama ke variabel baru. Kemudian Buat loop untuk dan loop melalui array. Di dalam loop membuat loop sementara dengan kondisi memeriksa apakah variabel yang baru dibuat sama dengan semua elemen dalam loop. jika pengembaliannya sama dengan true setelah for loop selesai, kembali false di dalam while loop.
sumber
The jawaban yang diterima bekerja hebat tapi saya ingin menambahkan sedikit. Itu tidak berfungsi untuk saya gunakan
===
karena saya membandingkan array array objek, namun di seluruh aplikasi saya, saya telah menggunakan paket fast-deep-equal yang sangat saya rekomendasikan. Dengan itu, kode saya terlihat seperti ini:dan data saya terlihat seperti ini:
sumber
Dan kamu DILAKUKAN!
sumber
Sekarang Anda dapat menggunakan set untuk melakukannya dengan mudah.
sumber
Anda bisa menggunakan for for:
sumber
Nah, ini sebenarnya tidak terlalu rumit. Saya memiliki kecurigaan yang kuat bahwa Anda bahkan tidak mencoba. Apa yang Anda lakukan adalah bahwa Anda memilih nilai pertama, menyimpannya dalam variabel, dan kemudian, dalam satu
for
lingkaran, bandingkan semua nilai berikutnya dengan yang pertama.Saya sengaja tidak membagikan kode apa pun. Temukan bagaimana
for
digunakan dan bagaimana variabel dibandingkan.sumber
Solusi satu baris yang sederhana, bandingkan saja dengan array yang diisi dengan entri pertama.
sumber
Cara lain yang menarik ketika Anda menggunakan sintaks fungsi panah ES6:
Dan ketika Anda tidak ingin menggunakan kembali variabel untuk array (x):
Poster IMO sebelumnya yang menggunakan array.every (...) memiliki solusi terbersih.
sumber
sumber
ini mungkin bekerja, Anda dapat menggunakan kode komentar juga yang juga baik dengan scenerio yang diberikan.
sumber
Cara lain dengan ukuran terbatas dan daftar terorganisir:
array1 = [1,2,3]; array2 = [1,2,3];
sumber
Anda dapat mengubah array menjadi Set dan memeriksa ukurannya
Dalam kasus entri array yang primitif, yaitu
number
,string
:Dalam kasus array objek dengan beberapa bidang yang akan diuji untuk kesetaraan, katakan
id
:sumber
Di PHP, ada solusi yang sangat sederhana, metode satu baris:
(hitung (array_count_values ($ array)) == 1)
Sebagai contoh :
Itu saja.
sumber