Перевірте, чи масив порожній чи недійсний


106

Я хотів би знати, як перевірити, чи масив порожній чи недійсний у jQuery. Я спробував, array.length === 0але не вийшло. Це також не кинуло жодної помилки.

Це код:

var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}

2
Так само, як у "звичайному JavaScript": stackoverflow.com/questions/2672380/…
Жульєн Шмідт

1
@Julien, я спробував усі ці рішення, перелічені в цій темі, перш ніж запускати цей потік. Жоден з них не працював якось.
вхід

Чи можемо ми отримати ще якийсь код для контексту? Оточуючий JavaScript, HTML? Ви впевнені, що $("input[name='album_text[]']")насправді повертаються елементи?
Джон Адамс

@JulienSchmidt: питання, з яким ви пов’язані, стосується перевірки, чи значення масиву порожнє, а не весь масив.
Дан Даскалеску

Відповіді:


168

Поки ваш селектор насправді працює, я не бачу нічого поганого у вашому коді, який перевіряє довжину масиву. Це має робити те, що ти хочеш. Існує маса способів очищення коду, щоб він був простішим і читабельнішим. Ось очищена версія з примітками про те, що я прибирав.

var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

Деякі примітки про те, що ви робили, і що я змінив.

  1. $(this)завжди є дійсним об’єктом jQuery, тому немає причин ніколи перевіряти if ($(this)). У ньому може бути ніяких об'єктів DOM, але ви можете перевірити це, $(this).lengthякщо вам потрібно, але це не потрібно, тому що .each()цикл не запускався, якби не було елементів, тому $(this)всередині вашого .each()циклу завжди буде щось.
  2. Неефективно використовувати $ (це) кілька разів в одній і тій же функції. Набагато краще перетворити його в локальну змінну, а потім використовувати її з цієї локальної змінної.
  3. Рекомендується ініціалізувати масиви з, []а не new Array().
  4. if (value)коли очікується, що значення буде рядком, буде захищено від value == null, value == undefinedі value == ""тому вам не доведеться цього робити if (value && (value != "")). Можна просто зробити: if (value)перевірити наявність усіх трьох порожніх умов.
  5. if (album_text.length === 0) підкаже, чи масив порожній до тих пір, поки це дійсний ініціалізований масив (який він знаходиться тут).

Що ви намагаєтеся зробити з цим селектором $("input[name='album_text[]']")?


5
@MaciekSemik - см stackoverflow.com/questions/359494 / ... . Я завжди використовую сувору рівність ( ===), якщо спеціально не хочу дозволити перетворення типу. Це хороша звичка потрапляти.
jfriend00

73

Користувач JQuery - це EmptyObject, щоб перевірити, чи містить масив елементи чи ні.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true

2
Набагато надійніше, ніж перевірка довжини, особливо якщо ваша змінна також може бути об’єктом (з об’єктами довжина не працює, щоб перевірити, чи порожня).
габоровий

Це більш відповідна на мою думку відповідь.
Earl3s

4
isEmptyObjectзавжди повертається, falseякщо Array.prototypeрозширено, наприклад Array.prototype.someFunction = function () {};- навіть якщо масив порожній. Зауважте, що деякі рамки (наприклад, Ember.js) розширюють прототип Array за замовчуванням.
jesenko

4
Будьте обережні з isEmptyObject! Для JQuery 1.8.3 jQuery.isEmptyObject([])повертається false, але JQuery 1.11.3 повертається true. Власне, у документації jQuery йдеться про те, що аргумент завжди повинен бути простим об’єктом JavaScript, оскільки інші типи об'єктів (елементи DOM, примітивні рядки / числа, об'єкти хосту) можуть не давати стійких результатів у веб-переглядачах. Вибачте, відповіді @rhinoxi не побачив.
Дмитро Вершинін

8

Ви повинні перевірити наявність ''(порожня рядок), перш ніж натиснути на свій масив. У вашому масиві є елементи, які є порожніми рядками. Тоді ваша album_text.length === 0робота буде прекрасною.


Перегляньте оновлений код. Я додав цей код, if( $(this).val() && $(this).val() != '') але він не працює.
вхід

8

Я думаю, що небезпечно використовувати $ .isEmptyObject з jquery, щоб перевірити, чи масив порожній, як згадував @jesenko. Я щойно зустрів цю проблему.

У документі isEmptyObject він згадує:

Аргумент завжди повинен бути простим об’єктом JavaScript

яку ви можете визначити $.isPlainObject. Повернення $.isPlainObject([])помилкове.

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