Проверьте, является ли массив пустым или нулевым


107

Я хотел бы знать, как проверить, является ли массив пустым или нулевым в 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/…
— Julien Schmidt

1
@Julien, я пробовал все решения, перечисленные в этой ветке, прежде чем начинать ее. Ни один из них как-то не работал.
— ввод

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

@JulienSchmidt: вопрос, с которым вы связались, касается проверки того, пусто ли значение массива , а не весь массив.
— Дэн Даскалеску

Ответы:


169

Пока ваш селектор действительно работает, я не вижу ничего плохого в вашем коде, который проверяет длину массива. Это должно делать то, что вы хотите. Есть много способов сделать ваш код более простым и читабельным. Вот очищенная версия с примечаниями о том, что я убрал.

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. Неэффективно использовать $ (this) несколько раз в одной функции. Гораздо лучше получить его один раз в локальную переменную, а затем использовать из этой локальной переменной.
  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

74

Пользовательский JQuery - EmptyObject, чтобы проверить, содержит ли массив элементы или нет.

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

2
Гораздо надежнее, чем проверка длины, особенно если ваша переменная также может быть объектом (с объектами длина не работает, чтобы проверить, пуста ли).
— gaborous

На мой взгляд, это более подходящий ответ.
— 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.