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

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

person input    schedule 25.08.2011    source источник
comment
Так же, как и в обычном JavaScript: stackoverflow.com/questions/2672380/   -  person Julien Schmidt    schedule 26.08.2011
comment
@Julien, я пробовал все решения, перечисленные в этой ветке, прежде чем начинать ее. Ни один из них как-то не работал.   -  person input    schedule 26.08.2011
comment
Можем ли мы получить еще код для контекста? Окружающий JavaScript, HTML? Вы уверены, что $("input[name='album_text[]']") действительно возвращает элементы?   -  person Jon Adams    schedule 26.08.2011
comment
@JulienSchmidt: вопрос, с которым вы связались, касается проверки того, является ли массив value пустым, а не весь массив.   -  person Dan Dascalescu    schedule 20.01.2017


Ответы (4)


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

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

person jfriend00    schedule 25.08.2011
comment
@MaciekSemik - см. stackoverflow.com/questions/359494/. Я всегда использую строгое равенство (===), если я специально не хочу разрешить преобразование типа. Это хорошая привычка. - person jfriend00; 13.04.2014

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

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
person Mayank Raipure    schedule 02.06.2014
comment
Гораздо надежнее, чем проверка длины, особенно если ваша переменная также может быть объектом (с объектами длина не работает, чтобы проверить, пуста ли). - person gaborous; 20.11.2014
comment
На мой взгляд, это более подходящий ответ. - person earl3s; 31.03.2015
comment
isEmptyObject всегда возвращает false, если Array.prototype расширен, например Array.prototype.someFunction = function () {}; - даже если массив пустой. Обратите внимание, что некоторые фреймворки (например, Ember.js) по умолчанию расширяют прототип Array. - person jesenko; 11.05.2015
comment
Будьте осторожны с isEmptyObject! Для jQuery 1.8.3 jQuery.isEmptyObject([]) возвращает false, но для jQuery 1.11.3 он возвращает true. На самом деле, в документации jQuery говорится, что аргументом всегда должен быть простой объект JavaScript, как и другие типы объектов (элементы DOM, примитивные строки / числа, объекты хоста) могут не давать согласованных результатов в разных браузерах. К сожалению, я не видел ответа @rhinoxi. - person Dmitry Vershinin; 16.11.2016

Я думаю, что опасно использовать $ .isEmptyObject из jquery, чтобы проверить, пуст ли массив, как упоминал @jesenko. Я только что столкнулся с этой проблемой.

В документе isEmptyObject упоминается:

Аргументом всегда должен быть простой объект JavaScript.

который вы можете определить по $.isPlainObject. Возвращение $.isPlainObject([]) ложно.

person rhinoxi    schedule 22.02.2016

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

person Daniel A. White    schedule 25.08.2011
comment
Пожалуйста, смотрите обновленный код. Я добавил этот код if( $(this).val() && $(this).val() != '') , но он не работает. - person input; 26.08.2011