Apakah ini akan berfungsi untuk menguji apakah nilai pada posisi "indeks" ada atau tidak, atau apakah ada cara yang lebih baik:
if(arrayName[index]==""){
// do stuff
}
Apakah ini akan berfungsi untuk menguji apakah nilai pada posisi "indeks" ada atau tidak, atau apakah ada cara yang lebih baik:
if(arrayName[index]==""){
// do stuff
}
Jawaban:
Secara konseptual, array dalam JavaScript berisi array.length
elemen, mulai array[0]
dari hingga array[array.length - 1]
. Elemen array dengan indeks i
didefinisikan sebagai bagian dari array jika i
berada di antara 0
dan array.length - 1
inklusif. Jika saya tidak berada dalam kisaran ini, itu tidak ada dalam array.
Jadi secara konsep, array adalah linear, dimulai dengan nol dan pergi ke maksimum, tanpa mekanisme untuk memiliki "celah" di dalam rentang itu di mana tidak ada entri. Untuk mengetahui apakah ada nilai pada indeks posisi tertentu (di mana indeks adalah 0 atau bilangan bulat positif), Anda benar-benar hanya menggunakan
if (i >= 0 && i < array.length) {
// it is in array
}
Sekarang, di bawah tenda, mesin JavaScript hampir pasti tidak akan mengalokasikan ruang array secara linear dan berdekatan seperti ini, karena tidak masuk akal dalam bahasa yang dinamis dan itu tidak efisien untuk kode tertentu. Mereka mungkin tabel hash atau beberapa campuran strategi, dan rentang array yang tidak ditentukan mungkin tidak dialokasikan memori mereka sendiri. Meskipun demikian, JavaScript bahasa yang ingin menyajikan array array.length
n sebagai memiliki n anggota dan mereka diberi nama 0 hingga n - 1 , dan apa pun dalam rentang ini adalah bagian dari array.
Apa yang Anda mungkin inginkan, bagaimanapun, adalah untuk mengetahui apakah suatu nilai dalam array sebenarnya sesuatu yang didefinisikan - yaitu, bukan undefined
. Mungkin Anda bahkan ingin tahu apakah itu didefinisikan dan tidaknull
. Dimungkinkan untuk menambahkan anggota ke array tanpa pernah menetapkan nilainya: misalnya, jika Anda menambahkan nilai array dengan meningkatkan array.length
properti, nilai baru apa pun akan menjadi undefined
.
Untuk menentukan apakah nilai yang diberikan adalah sesuatu yang bermakna, atau telah didefinisikan. Itu bukan undefined
, atau null
:
if (typeof array[index] !== 'undefined') {
atau
if (typeof array[index] !== 'undefined' && array[index] !== null) {
Menariknya, karena aturan perbandingan JavaScript, contoh terakhir saya dapat dioptimalkan hingga ini:
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
properti, dalam hal ini dua contoh kemudian lebih tepat.
foo !== 'undefined' && foo !== null
dengan hanyafoo != null
0
hingga array.length - 1
. Tidak semua nilai ini akan didefinisikan sebagai nilai. Jika Anda menggunakan kata kunci hapus pada anggota array, itu akan membuat anggota itu kembali menjadi tidak terdefinisi, seperti halnya jika Anda memperpanjang array dengan menambah parameter array.lengthnya, nilai-nilai baru akan mulai sebagai tidak terdefinisi. Pada kenyataannya, implementasi Javascript mungkin akan mengoptimalkan penyimpanan array dan beberapa atau semua nilai yang tidak terdefinisi mungkin tidak menempati memori.
new Array(1)[0] === undefined
tetapi nilainya kosong. [undefined][0] === undefined
tetapi nilainya ditentukan; array memiliki nilai. Satu-satunya jawaban sempurna adalah menggunakan in
atau hasOwnProperty()
- idx in array
atau array.hasOwnProperty(idx)
--per jawaban ini: stackoverflow.com/a/39171620/3120446
Tidak bisakah kita melakukan ini saja:
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
ada bedanya?
if(arrayName.length) {...
gagal padanull
[undefined, undefined]
yang merupakan array dengan panjang = 2.
Hanya menggunakan .length
tidak aman dan akan menyebabkan kesalahan di beberapa browser. Inilah solusi yang lebih baik:
if(array && array.length){
// not empty
} else {
// empty
}
atau, kita dapat menggunakan:
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
hanya akan berlaku untuk null atau undefined, tidak ada yang lain. Demikian juga, x != null
akan berlaku untuk apa pun yang bukan nol atau tidak terdefinisi. Kecuali jika Anda secara khusus perlu mencari yang tidak terdefinisi, hanya bersandar pada kebaikan konversi implisit.
Pendekatan pendek dan universal
Jika Anda ingin memeriksa array apa pun jika memiliki nilai falsy (seperti string false, undefined, null, atau kosong) Anda bisa menggunakan setiap metode () seperti ini:
array.every(function(element) {return !!element;}); // returns true or false
Sebagai contoh:
['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true
Jika Anda perlu mendapatkan indeks pertama dari nilai falsy, Anda dapat melakukannya seperti ini:
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
Jika Anda hanya perlu memeriksa nilai falsy dari array untuk indeks yang diberikan, Anda bisa melakukannya seperti ini:
if (!!array[index]) {
// array[index] is a correct value
}
else {
// array[index] is a falsy value
}
if(typeof arr ==='object' && arr instanceof Array ){
if(!arr.length){
println 'empty'
}else{
printn 'not Empty'
}
}else{
println 'Null'
}
Jika Anda maksud dengan 'Null' -> Elemen-elemennya adalah nol atau sama dengan '', dalam hal ini: Periksa apakah array kosong setelah memfilter semua elemen 'null'
if(!arr.clean().length){return 'is null'}
Tentu saja, Tambahkan metode Bersihkan sebelum:
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
Saya akan merekomendasikan membuat fungsi seperti ini:
function isEmptyEl(array, i) {
return !(array[i]);
}
Anda bisa menyebutnya seperti ini:
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
Memaksa pengembang untuk mematuhi antarmuka isEmptyEl akan menangkap kesalahan input seperti variabel arrayName atau indexVal yang tidak ditentukan.
(Ini umumnya praktik yang baik untuk memprogram pertahanan saat pemrograman dalam Javascript.)
Anda akan mendapatkan kesalahan seperti ini jika arrayName tidak didefinisikan:
Uncaught ReferenceError: arrayName is not defined
at <anonymous>:2:15
at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
Hasil serupa untuk indexVal yang tidak ditentukan.
Anda mendapatkan kesalahan jika nilai array atau indeks tidak ada.
Untuk input yang valid, Anda hanya akan mendapatkan true jika arrayName [indexVal] adalah salah satu dari yang berikut:
Itu tergantung pada apa yang Anda maksud dengan "kosong".
Saat Anda mencoba untuk mendapatkan nilai properti pada objek yang tidak memiliki properti dengan nama itu, Anda akan mendapatkan nilai undefined
.
Itulah yang terjadi dengan array jarang: tidak semua indeks antara 0
dan array.length-1
ada.
Jadi Anda bisa memeriksa array[index] === undefined
.
Namun, properti index
bisa ada dengan suatu undefined
nilai. Jika Anda ingin memfilter kasing ini, Anda dapat menggunakan in
operator atau hasOwnProperty
, seperti dijelaskan dalam Bagaimana cara memeriksa apakah suatu objek memiliki properti di JavaScript?
index in array;
array.hasOwnProperty(index);
Jika Anda ingin mempertimbangkan properti yang ada dengan undefined
atau null
nilainya tidak ada, Anda dapat menggunakan perbandingan longgar array[index] == undefined
atau array[index] == null
.
Jika Anda tahu arraynya tidak jarang, Anda dapat membandingkannya index
dengan array.length
. Tetapi agar aman, Anda mungkin ingin memastikan bahwa itu index
benar - benar indeks array, lihat Periksa apakah nama properti adalah indeks array
OK, pertama mari kita lihat apa yang akan terjadi jika nilai array tidak ada di JavaScript, jadi jika kita memiliki array seperti di bawah ini:
const arr = [1, 2, 3, 4, 5];
dan sekarang kita periksa apakah 6 ada di indeks 5 atau tidak:
arr[5];
dan kami mendapatkan
undefined
...
Jadi itu pada dasarnya memberi kita jawaban, cara terbaik untuk memeriksa apakah tidak terdefinisi, jadi kira-kira seperti ini:
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
Lebih baik TIDAK melakukan ini dalam hal ini:
if(!arrayName[index]) {
//Don't check like this..
}
Karena bayangkan kita memiliki array ini:
const arr = [0, 1, 2];
dan kami melakukannya:
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
Jadi seperti yang Anda lihat, bahkan 0 ada di sana, itu tidak dikenali, ada beberapa hal lain yang dapat melakukan hal yang sama dan membuat Anda buggy aplikasi, jadi hati-hati, saya daftar semuanya:
undefined
''
Saya ingin menunjukkan sesuatu yang sepertinya terlewatkan oleh beberapa orang: yaitu dimungkinkan untuk memiliki posisi array "kosong" di tengah array Anda. Pertimbangkan yang berikut ini:
let arr = [0, 1, 2, 3, 4, 5]
delete arr[3]
console.log(arr) // [0, 1, 2, empty, 4, 5]
console.log(arr[3]) // undefined
Cara alami untuk memeriksa kemudian adalah untuk melihat apakah anggota array tidak terdefinisi, saya tidak yakin apakah ada cara lain
if (arr[index] === undefined) {
// member does not exist
}
Dengan Lodash, Anda dapat melakukan:
if(_.has(req,'documents')){
if (req.documents.length)
_.forEach(req.documents, function(document){
records.push(document);
});
} else {
}
if(_.has(req,'documents'))
adalah untuk memeriksa apakah objek permintaan kami memiliki properti bernama documents
dan jika memiliki prop itu, selanjutnya if (req.documents.length)
adalah memvalidasi jika itu bukan array kosong, sehingga barang-barang lain seperti forEach
dapat diproses.
Untuk memeriksa apakah belum pernah ditentukan atau apakah sudah dihapus:
if(typeof arrayName[index]==="undefined"){
//the index is not in the array
}
juga bekerja dengan array asosiatif dan array tempat Anda menghapus beberapa indeks
Untuk memeriksa apakah itu tidak pernah didefinisikan, telah dihapus ATAU adalah nilai kosong nol atau logis (NaN, string kosong, salah):
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
Saya mengalami masalah ini menggunakan datarables laravel. Saya menyimpan nilai JSON yang disebut properties
dalam log aktivitas dan ingin menunjukkan tombol berdasarkan nilai ini kosong atau tidak.
Nah, datatables menafsirkan ini sebagai array jika itu kosong, dan objek jika bukan, oleh karena itu, solusi berikut ini bekerja untuk saya:
render: function (data, type, full) {
if (full.properties.length !== 0) {
// do stuff
}
}
Objek tidak memiliki properti panjang.
Saya pikir keputusan ini sesuai untuk orang-orang yang lebih suka pemrograman fungsional deklaratif daripada OOP imperatif atau prosedural. Jika pertanyaan Anda adalah " Apakah ada beberapa nilai di dalam? (Nilai true atau falsy)" Anda dapat menggunakan .some
metode untuk memvalidasi nilai-nilai di dalamnya.
[].some(el => el || !el);
function isEmpty(arr) { ... }
.[].length
menghasilkan 0
yang berbahaya dalam beberapa kasus.[].length > 0
pepatah ini "Apakah panjangnya lebih besar dari nol?"Contoh lanjutan:
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
Anda dapat menggunakan perpustakaan Loadsh untuk melakukan ini dengan lebih efisien, seperti:
jika Anda memiliki larik bernama "hewan peliharaan", misalnya:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
Untuk memeriksa semua nilai array untuk nilai null atau tidak terdefinisi:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Lihat lebih banyak contoh di http://underscorejs.org/
fn(){}
adalah kesalahan sintaks, dan tidak jelas sama sekali bagaimana ini membantu memeriksa apakah item array ada pada indeks tertentu atau tidak.