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


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.