Як перевірити в JavaScript, чи існує значення для певного індексу масиву?


521

Чи вдасться це перевірити, чи існує значення в позиції "індекс" чи немає, чи є кращий спосіб:

if(arrayName[index]==""){
     // do stuff
}

6
Зауважте, не бажаючи перевіряти, чи весь масив порожній, лише певне місце, яке має значення індексу "індекс"
Ankur

Заголовок можна вдосконалити, сказавши "Як перевірити JavaScript, чи існує значення в певному індексі масиву".
demisx

Відповіді:


738

Концептуально масиви в JavaScript містять array.lengthелементи, починаючи з array[0]до array[array.length - 1]. Елемент масиву з індексом iвизначається як частина масиву, якщо він iзнаходиться між 0і array.length - 1включно. Якщо я не в цьому діапазоні, він не знаходиться в масиві.

Отже, за принципом, масиви є лінійними, починаючи з нуля і йдучи до максимуму, без жодного механізму наявності "прогалин" всередині цього діапазону, де немає записів. Щоб дізнатись, чи існує значення в заданому індексі позиції (де індекс дорівнює 0 або додатне ціле число), ви буквально використовуєте

if (i >= 0 && i < array.length) {
  // it is in array
}

Тепер, під капотом, двигуни JavaScript майже напевно не будуть розподіляти простір масиву лінійно та безперервно, як це, оскільки це не має особливого сенсу в динамічній мові, і це буде неефективним для певного коду. Вони, ймовірно, мають хеш-таблиці або якусь гібридну суміш стратегій, а невизначені діапазони масиву, ймовірно, не виділяють власну пам’ять. Тим не менш, JavaScript мовою хоче представити масиви з array.length n як такі, що мають n членів, і вони названі від 0 до n - 1 , і все, що в цьому діапазоні є частиною масиву.

Ти, мабуть, хочеш, але це знати, чи значення в масиві насправді щось визначене - тобто це не так undefined. Можливо, ви навіть хочете знати, чи визначено це, чи ніnull . Можна додати членів до масиву, не встановлюючи їх значення: наприклад, якщо ви додаєте значення масиву, збільшуючи array.lengthвластивість, будь-які нові значення будуть undefined.

Визначити, чи є дане значення чимось значущим, чи було визначене. Тобто ні undefined , або null:

if (typeof array[index] !== 'undefined') {

або

if (typeof array[index] !== 'undefined' && array[index] !== null) {

Цікаво, що через правила порівняння JavaScript, мій останній приклад можна оптимізувати до цього:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
З великою ймовірністю, що ОП знає, з яким типом масиву він / хто має справу, але просто для повноти: об’єкти, подібні до масиву, також зазвичай містять lengthвластивість, і в цьому випадку наступні два приклади є більш підходящими.
Джастін Джонсон

9
ви завжди можете замінити foo !== 'undefined' && foo !== nullпростоfoo != null
thinklinux

1
@TheComposer в відповідно до мови розмір масиву в JavaScript , визначається Array.length, а масив називається містити всі елементи з 0до array.length - 1. Однак не всі ці значення будуть визначеними значеннями. Якщо ви використовуєте ключове слово delete для члена масиву, воно поверне його до невизначеного, як і якщо розширити масив, збільшивши його параметр array.length, нові значення почнуть не визначатися. Насправді реалізація Javascript, ймовірно, оптимізує сховище масиву, і деякі або всі невизначені значення можуть не займати пам'яті.
thomasrutter

1
array.length не повторює нічого, це лише одне число.
thomasrutter

1
Ця відповідь не охоплює випадки, коли індекс масиву не встановлений. new Array(1)[0] === undefinedале значення порожнє. [undefined][0] === undefinedале значення встановлено; масив має значення. Єдиний ідеальний відповідь , використовуючи inабо hasOwnProperty()- idx in arrayабо array.hasOwnProperty(idx): --per ця відповідь stackoverflow.com/a/39171620/3120446
dx_over_dt

350

Чи не можемо ми просто так:

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

10
Питання полягало у тому, як перевірити, чи існує певний індекс масиву чи ні.
thomasrutter

26
Було if(arrayName.length) {...б якесь значення?
siannone

10
Чому так багато оновлень? Це однозначно не відповідає на питання.
algiogia

10
if(arrayName.length) {...виходить з ладуnull
Ронні Ройстон

5
це не вдається, а [undefined, undefined]це масив довжиною = 2.
Soldeplata Saketos

41

Використання лише .lengthне є безпечним і призведе до помилки в деяких браузерах. Ось краще рішення:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

або ми можемо використовувати:

Object.keys(__array__).length

2
«Зверніть увагу, не бажаючи перевіряти, чи весь масив порожній, лише певне місце, яке має значення індексу" індекс "»
Oriol

приємна, коротка та проста відповідь для тих, хто хоче перевірити весь масив
Луїс Мартінс

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

8
Це також зробить інформацію, якщо значення масиву існує, але це 0, null, "" тощо.
thomasrutter

Томас правий; однак цього достатньо для багатьох випадків (які, ймовірно, слід перерахувати).
Джастін Джонсон

далеко не найпростіший спосіб
вимикач

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

@thomasrutter У мене виникають проблеми із створенням способу, який можна було б визначити з елементом масиву, який не визначений.
Rex M

Гммм, чи працює (міаррей [1] = невизначений)? Або просто (myarray [1] = undefined)?
thomasrutter

@thomasrutter обидва з них кинуть виняток, ні? (undefinedvariable is undefined)
Рекс М

1
Ви можете перевірити це на собі, використовуючи щось на зразок Firebug. У Javascript зчитування значення невизначеної змінної не викидає виключення - воно повертає невизначене значення.
thomasrutter

@thomasrutter Ви помиляєтесь у своєму першому коментарі. x == nullбуде вірно тільки для нульового або невизначеного, нічого іншого. Так само x != nullбуде справедливо для будь-якого, що не є ні нульовим, ні визначеним. Якщо вам конкретно не потрібно шукати невизначеного, просто спирайтеся на неявну конверсійну доброту.
Маркус Стейд

8

Короткий і універсальний підхід

Якщо ви хочете перевірити будь-який масив, чи є у нього помилкові значення (наприклад, помилкові, невизначені, нульові чи порожні рядки), ви можете просто скористатися кожним методом () таким:

array.every(function(element) {return !!element;}); // returns true or false

Наприклад:

['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

Якщо вам потрібно отримати перший показник помилкового значення, ви можете зробити це так:

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

Якщо вам просто потрібно перевірити помилкове значення масиву для заданого індексу, ви можете це зробити так:

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'
}

Якщо ви маєте на увазі під «Null» -> Його елементи є null або дорівнює '', в цьому випадку: Перевірте, чи масив порожній після фільтрації всіх елементів 'null'

if(!arr.clean().length){return 'is null'}

Звичайно, додати метод очищення раніше:

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

Я рекомендую створити таку функцію:

function isEmptyEl(array, i) {
   return !(array[i]);
}

Ви можете назвати це так:

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

Примушуючи розробника дотримуватися інтерфейсу isEmptyEl, вони вловлюють помилки введення, такі як невизначений змінний arrayName або indexVal.

(Зазвичай, це хороша практика програмувати захисно при програмуванні в Javascript.)

Ви отримаєте помилку, викинуту таким чином, якщо arrayName не визначено:

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)

Аналогічні результати для невизначеного indexVal.

Ви отримуєте помилку, якщо значення масиву чи індексу не існують.

Для дійсного введення, ви отримаєте істинне лише у тому випадку, якщо arrayName [indexVal] має будь-яку з наведених нижче дій:

  • нуль
  • невизначений
  • NaN
  • порожній рядок
  • 0
  • помилковий

5

Це залежить від того, що ви маєте на увазі під "порожнім".

При спробі отримати значення властивості для об'єкта, який не має властивості з таким ім'ям, ви отримаєте значення undefined .

Ось що відбувається з розрідженими масивами: не всі індекси між 0і array.length-1існують.

Тож ви могли перевірити, чи є array[index] === undefined.

Однак властивість indexможе існувати зі undefinedзначенням. Якщо ви хочете відфільтрувати цей випадок, ви можете скористатися inоператором або hasOwnProperty, як описано в розділі Як перевірити, чи має об’єкт властивість у JavaScript?

index in array;
array.hasOwnProperty(index);

Якщо ви хочете вважати, що існуюча властивість із значенням undefinedабо nullзначенням не існує, ви можете скористатися нестабільним порівнянням array[index] == undefinedабоarray[index] == null .

Якщо ви знаєте , що маса не розріджений, ви могли б порівняти indexз array.length. Але для безпеки ви можете переконатися, що це indexдійсно індекс масиву, див. Перевірте, чи ім'я властивості - це індекс масиву


2
Це єдина відповідь, яка належним чином розподіляє між невстановленими елементами масиву (які не мають жодного значення) та елементами, встановленими на невизначене значення. Дві стани розмиваються тим, що доступ до невстановленого елемента масиву повертається невизначеним, але вони різні.
олівр

Використовуйте hasOwnProperty, коли у вас є масив з потенційно не встановленими значеннями (відмінними від невизначених або нульових).
CMCDragonkai

1

Добре, давайте спочатку подивимося, що буде, якщо значення масиву в JavaScript не існує, тож якщо у нас є масив, як показано нижче:

const arr = [1, 2, 3, 4, 5];

і тепер ми перевіряємо, чи є 6 в індексі 5 чи ні:

arr[5];

і ми отримуємо undefined...

Отже, це в основному дає нам відповідь, найкращий спосіб перевірити, чи не визначено, так щось подібне:

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

У цьому випадку НЕ робити цього:

if(!arrayName[index]) {
  //Don't check like this..
}

Тому що уявіть, у нас є цей масив:

const arr = [0, 1, 2];

і ми робимо:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

Отже, як ви бачите, навіть 0 є, він не впізнається, є кілька інших речей, які можуть зробити те саме, і зробити вас додатком помилковим, тому будьте обережні, я перераховую їх усіх:

  1. undefined : якщо значення не визначене, воно єundefined
  2. null : якщо це null, наприклад, якщо елемента DOM не існує ...
  3. порожній рядок :''
  4. 0 : число нуль
  5. NaN : не число
  6. помилковий

1

Я хотів би зазначити те, що деякі, здається, пропустили: а саме в середині вашого масиву можливе розташування "порожнього" масиву. Розглянемо наступне:

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

Природним способом перевірки було б потім побачити, чи не визначено член масиву, я не впевнений, чи існують інші способи

if (arr[index] === undefined) {
  // member does not exist
}

0

спробуйте це, якщо масив [індекс] є нульовим

if (array[index] != null) 

0

З Лодашем ви можете:

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))полягає в тому, щоб перевірити, чи є у нашого об’єкта запиту властивість, іменоване, documentsі чи є у нього відповідна опора, наступне if (req.documents.length)- перевірити, якщо це не порожній масив, тож інші елементи, подібні до цього, forEachможна продовжити.


0

Щоб перевірити, чи він ніколи не був визначений чи його видалено:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

також працює з асоціативними масивами та масивами, де ви видалили деякий індекс

Щоб перевірити, чи ніколи не було визначено, було видалено АБО - це нульове або логічне порожнє значення (NaN, порожня рядок, помилка):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

Я зіткнувся з цією проблемою за допомогою даних даних про laravel. Я зберігав значення JSON, викликане propertiesв журналі активності, і хотів показати кнопку, засновану на тому, що це значення порожнє чи ні.

Що ж, таблиці даних інтерпретували це як масив, якщо він порожній, і об'єкт, якщо його немає, тому для мене працювало таке рішення:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

Об'єкт не має властивості довжини.


0

Я вважаю, що це рішення підходить для хлопців, які віддають перевагу декларативному функціональному програмуванню над імперативним ООП або процедурним. Якщо у вас запитання " Чи є якісь значення всередині? (Truthy або хибне значення)", ви можете використовувати .someметод для перевірки значень всередині.

[].some(el => el || !el);
  • Це не ідеально, але не вимагає застосування будь-якої додаткової функції, що містить таку ж логіку, як function isEmpty(arr) { ... }.
  • Це все ще звучить краще, ніж "Це нульова довжина?" коли ми це робимо, [].lengthвнаслідок 0чого це небезпечно в деяких випадках.
  • Або навіть ця [].length > 0приказка "Чи довжина її більша за нуль?"

Розширені приклади:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

Ви можете скористатися бібліотекою Cargoh, щоб зробити це більш ефективно, наприклад:

якщо у вас є масив з назвою "домашні тварини", наприклад:

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) ) });

Щоб перевірити всі значення масиву на нульові або невизначені значення:

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>

Перегляньте більше прикладів на http://underscorejs.org/


fn(){}є синтаксичною помилкою, і зовсім не ясно, як це допомагає перевірити, чи існує елемент масиву в певному індексі чи ні.
Оріол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.