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

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[]']")?

jfriend00
источник
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([])ложный.

носорог
источник