Bagaimana cara saya memeriksa JavaScript jika ada nilai pada indeks array tertentu?


521

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
}

6
Harap dicatat, tidak ingin memeriksa apakah seluruh array kosong, hanya lokasi tertentu yang memiliki nilai indeks "indeks"
Ankur

Judul dapat ditingkatkan dengan mengatakan "Bagaimana cara saya memeriksa JavaScript jika ada nilai pada indeks array tertentu".
demisx

Jawaban:


738

Secara konseptual, array dalam JavaScript berisi array.lengthelemen, mulai array[0]dari hingga array[array.length - 1]. Elemen array dengan indeks ididefinisikan sebagai bagian dari array jika iberada di antara 0dan array.length - 1inklusif. 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.lengthproperti, 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
}  

6
Sangat mungkin bahwa OP tahu seperti apa array s / dia berurusan dengan, tetapi hanya untuk kelengkapan: objek seperti array juga biasanya mengandung lengthproperti, dalam hal ini dua contoh kemudian lebih tepat.
Justin Johnson

9
Anda selalu dapat menggantinya foo !== 'undefined' && foo !== nulldengan hanyafoo != null
thinklinux

1
@TheComposer menurut bahasa ukuran array dalam Javascript didefinisikan oleh array.length, dan array dikatakan terdiri dari semua elemen dari 0hingga 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.
thomasrutter

1
array.length tidak mengulangi apa pun, itu hanya satu nomor.
thomasrutter

1
Jawaban ini tidak mencakup kasus di mana indeks array tidak diatur. new Array(1)[0] === undefinedtetapi nilainya kosong. [undefined][0] === undefinedtetapi nilainya ditentukan; array memiliki nilai. Satu-satunya jawaban sempurna adalah menggunakan inatau hasOwnProperty()- idx in arrayatau array.hasOwnProperty(idx)--per jawaban ini: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

Tidak bisakah kita melakukan ini saja:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
Pertanyaannya adalah tentang bagaimana menguji apakah indeks array tertentu ada atau tidak.
thomasrutter

26
Apakah if(arrayName.length) {...ada bedanya?
siannone

10
Mengapa begitu banyak upvotes? Ini jelas tidak menjawab pertanyaan.
algiogia

10
if(arrayName.length) {...gagal padanull
Ronnie Royston

5
ini gagal dengan [undefined, undefined]yang merupakan array dengan panjang = 2.
Soldeplata Saketos

41

Hanya menggunakan .lengthtidak 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

2
«Harap dicatat, tidak ingin memeriksa apakah seluruh array kosong, hanya lokasi tertentu yang memiliki nilai indeks" indeks "»
Oriol

jawaban yang bagus, pendek dan sederhana bagi mereka yang ingin memeriksa seluruh array
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
Ini juga akan melakukan hal-hal jika nilai array ada tetapi 0, null, "", dll.
thomasrutter

Thomas benar; Namun, ini cukup untuk banyak kasus (yang mungkin harus Anda sebutkan).
Justin Johnson

sejauh ini cara paling sederhana
the-breaker

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@ thomasrutter Saya mengalami masalah dengan cara itu mungkin untuk berakhir dengan elemen array yang tidak terdefinisi.
Rex M

Hmmm, apakah (myarray [1] = undefinedvariable) berfungsi? Atau adil (myarray [1] = tidak terdefinisi)?
thomasrutter

@thomasrutter keduanya akan memberikan pengecualian, bukan? (undefinedvariable tidak terdefinisi)
Rex M

1
Anda dapat mengujinya sendiri menggunakan sesuatu seperti Firebug. Dalam Javascript, membaca nilai dari variabel yang tidak terdefinisi tidak menghasilkan pengecualian - ia mengembalikan nilai yang tidak ditentukan.
thomasrutter

@thomasrutter Anda salah dalam komentar pertama Anda. x == nullhanya akan berlaku untuk null atau undefined, tidak ada yang lain. Demikian juga, x != nullakan 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.
Marcus Stade

8

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
}

6
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!='')})}

5

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:

  • batal
  • tidak terdefinisi
  • NaN
  • string kosong
  • 0
  • Salah

5

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 0dan array.length-1ada.

Jadi Anda bisa memeriksa array[index] === undefined.

Namun, properti indexbisa ada dengan suatu undefinednilai. Jika Anda ingin memfilter kasing ini, Anda dapat menggunakan inoperator 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 undefinedatau nullnilainya tidak ada, Anda dapat menggunakan perbandingan longgar array[index] == undefinedatau array[index] == null.

Jika Anda tahu arraynya tidak jarang, Anda dapat membandingkannya indexdengan array.length. Tetapi agar aman, Anda mungkin ingin memastikan bahwa itu indexbenar - benar indeks array, lihat Periksa apakah nama properti adalah indeks array


2
Ini adalah satu-satunya jawaban yang membedakan antara item array yang tidak disetel (yang tidak memiliki nilai) dan item yang diatur ke nilai yang tidak ditentukan. 2 status dikaburkan oleh fakta bahwa mengakses item array yang tidak diset akan mengembalikan yang tidak ditentukan, tetapi mereka berbeda.
olivr

Gunakan hasOwnProperty ketika Anda memiliki array dengan nilai yang berpotensi tidak disetel (berbeda dari yang tidak ditentukan atau nol).
CMCDragonkai

1

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:

  1. undefined : jika nilainya tidak ditentukan dan ituundefined
  2. null : jika itu nol, misalnya jika elemen DOM tidak ada ...
  3. string kosong :''
  4. 0 : angka nol
  5. NaN : bukan angka
  6. Salah

1

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
}

0

coba ini jika array [indeks] adalah nol

if (array[index] != null) 

0

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 documentsdan jika memiliki prop itu, selanjutnya if (req.documents.length)adalah memvalidasi jika itu bukan array kosong, sehingga barang-barang lain seperti forEachdapat diproses.


0

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
}

0

Saya mengalami masalah ini menggunakan datarables laravel. Saya menyimpan nilai JSON yang disebut propertiesdalam 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.


0

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 .somemetode untuk memvalidasi nilai-nilai di dalamnya.

[].some(el => el || !el);
  • Itu tidak sempurna tetapi tidak perlu menerapkan fungsi tambahan yang mengandung logika yang sama, seperti function isEmpty(arr) { ... }.
  • Masih terdengar lebih baik daripada "Apakah panjangnya nol?" ketika kita melakukan ini [].lengthmenghasilkan 0yang berbahaya dalam beberapa kasus.
  • Atau bahkan [].length > 0pepatah 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

-1

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.
Oriol
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.