Проверьте, если массив пуст или существует

358

Когда страница загружается в первый раз, мне нужно проверить, есть ли изображение, image_arrayи загрузить последнее изображение.

В противном случае я отключаю кнопки предварительного просмотра, предупреждаю пользователя о необходимости нажать кнопку нового изображения и создаю пустой массив для размещения изображений;

Проблема в том, что image_arrayв elseкострах все время. Если массив существует - он просто переопределяет его, но оповещение не работает.

if(image_array.length > 0)
    $('#images').append('<img src="'+image_array[image_array.length-1]+'" class="images" id="1" />');
else{
    $('#prev_image').attr('disabled', 'true');
    $('#next_image').attr('disabled', 'true');
    alert('Please get new image');
    var image_array = [];
}

ОБНОВЛЕНИЕ Перед загрузкой HTML, у меня есть что-то вроде этого:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>
user1564141
источник
Консольный журнал image_array- что вы получаете?
Утканос
@Utkanos, если есть var image_array = [] - не определено, если // var image_array = [] (закомментировано) - реальный массив.
user1564141
массив? .length - широко поддерживается и скоро станет встроенной функцией
Анбу Агарвал

Ответы:

518
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

Ваша проблема может возникать из-за сочетания неявных глобальных переменных и перемещения переменных. Убедитесь, что вы используете varкаждый раз при объявлении переменной:

<?php echo "var image_array = ".json_encode($images);?>
// add var  ^^^ here

И затем убедитесь, что вы случайно не переопределите эту переменную позже:

else {
    ...
    image_array = []; // no var here
}
jbabey
источник
33
Нет. Это будет взрываться, когда image_array равен нулю. Закон Мерфи гласит, что когда-нибудь это произойдет.
Марко Фаустинелли
7
Не image_array.lengthдостаточно? (без указания >0)
mcont
Любопытно: Можете ли вы найти какой-либо вариант использования, который сломался бы, используя ответ @JamesDrinkard?
Цемер
12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234
195

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

Современный способ, ES5 +:

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

Старый школьный путь:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

Компактный способ:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

Способ CoffeeScript:

if array?.length > 0

Почему?

Case Undefined
Undefined variable - это переменная, которой вы еще ничего не присвоили.

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

Случай Нуль
Вообще говоря, ноль - это состояние отсутствия значения. Например, переменная равна нулю, если вы пропустили или не смогли получить некоторые данные.

array = searchData();  // can't find anything
array == null;         // => true

Case Not Array
Javascript имеет динамическую систему типов. Это означает, что мы не можем гарантировать, какой тип объекта содержит переменная. Есть вероятность, что мы не говорим об одном экземпляре Array.

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
Теперь, когда мы протестировали все другие возможности, мы говорим об экземпляре Array. Чтобы убедиться, что он не пустой, мы спрашиваем о количестве элементов, которые он содержит, и проверяем, чтобы в нем было больше нуля элементов.

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true
Поян Хосрави
источник
8
Пожалуйста , обратите внимание , что не достаточно просто проверить , (typeof array != "undefined" && array.length > 0)потому что , если arrayравно нулю , мы получим TypeError: Cannot read property 'length' of null.
Пуян Хосрави
Может быть, изменить && с ||
Сахар Ч.
!(typeof array !== "undefined") || !(array.length > 0)? Только что попробовал, получил ту же ошибку. Можете ли вы дать нам полный пример того, как использовать ||?
Пооян Хосрави
Я имел в виду(typeof array != "undefined" || array.length > 0)
Сахар Ч.
Спасибо за разъяснение. (typeof array != "undefined" || array.length > 0)возвращается , trueесли array = null. !(typeof array != "undefined" || array.length > 0)возвращается , falseесли array = [1,2]. Извините, что не понимаю, но @Elsa не могли бы вы привести рабочий пример? Заранее спасибо.
Пооян Хосрави
70

Как насчет (ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
Queequeg
источник
1
Re .. && image_array.length). ИМХО, хотя вы можете смело полагаться на свободную типизацию JS для преобразования целого 0числа в целое falseи non-zeroцелое число true, я считаю, что для удобства чтения в будущем предпочтительнее «сказать, что вы имеете в виду». Я бы сделал .. && image_array.length > 0).
ToolmakerSteve
28

Это то, что я использую. Первое условие охватывает истину, которая имеет как нулевое, так и неопределенное значение. Второе условие проверяет наличие пустого массива.

if(arrayName && arrayName.length > 0){
    //do something.
}

или благодаря комментарию Цемера я добавил вторую версию

if(arrayName && arrayName.length)

Затем я сделал тест для второго условия, используя Scratchpad в Firefox:

var array1;
var array2 = [];
var array3 = ["one", "two", "three"];
var array4 = null;

console.log(array1);
console.log(array2);
console.log(array3);
console.log(array4);

if (array1 && array1.length) {
  console.log("array1! has a value!");
}

if (array2 && array2.length) {
  console.log("array2! has a value!");
}

if (array3 && array3.length) {
  console.log("array3! has a value!");
}

if (array4 && array4.length) {
  console.log("array4! has a value!");
}

что также доказывает это if(array2 && array2.length)и if(array2 && array2.length > 0)делает то же самое

Джеймс Дринкард
источник
13
Я считаю это наиболее кратким и охватывает все вопросы об исключениях. А поскольку ты любишь правду, можешь даже обойтисьif (arrayName && arrayName.length)
Цемер
2
Коротко и быстро! Мне потребовалось некоторое время, чтобы прийти из C #, чтобы привыкнуть к if (obj) проверять на ноль, но теперь мне это нравится: if (obj) // null check; if (array && array.length) // массив null или empty check; if (array &&! array.length) // массив существует, но пустой check; if (str) // строка не пустая и не пустая. Единственное, что надо - не использовать цифры, если ноль является действительным числом.
Рик Лав
1
Я использовал (arrayName && arrayName.length) некоторое время, затем я забеспокоился, если что-то может быть не так. Этот ответ меня успокоил, спасибо :)
Корай
В Typescript есть нюансы, так как для var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0типа для isNotEmpty не будет логическим, это будет логическим | undefined.
Гиедрюс
15

Вы должны использовать:

  if (image_array !== undefined && image_array.length > 0)
Самсон
источник
8

Если вы хотите проверить, была ли определена переменная массива изображения, вы можете сделать это следующим образом

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}
Майк Брант
источник
Не работает dl.dropbox.com/u/14396564/screens/...
user1564141
@ user1564141 трудно сказать, где объявляется функция относительно установленного массива image_array. Возможно, у вас проблема с хостингом, поэтому вам может потребоваться объявить эту переменную как var index_array = ... Кроме того, это тег сценария, в котором вы устанавливаете закрытие index_array. Это не так на скриншоте.
Майк Брант
В остальном также есть предупреждение, которое срабатывает только тогда, когда массив пуст, но переменная image_array работает каждый раз ... Я не могу понять, почему?
user1564141
@ user1564141 Было бы полезно, если бы вы могли обновить свой вопрос, чтобы показать исходный текст как вывод. Я до сих пор не понимаю, где ваша логика if-else находится в источнике относительно расположения вашей декларации index_array.
Майк Брант
6

JavaScript

( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )

Лодаш и Подчеркивание

( _.isArray(myArray) && myArray.length > 0 )
Амит Бхагат
источник
6

Вы можете использовать jQuery isEmptyObject()для проверки, содержит ли массив элементы или нет.

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

Источник: https://api.jquery.com/jQuery.isEmptyObject/

Mayank Raipure
источник
Это единственное, что сработало для меня при добавлении элементов с помощью array.push () - из динамически добавляемых элементов (ajax). Спасибо
TomoMiha
3

Простой способ, который не приводит к исключениям, если они не существуют, и конвертируется в логическое значение:

!!array

Пример:

if (!!arr) {
  // array exists
}
insign
источник
3

Как насчет этого ? проверка длины неопределенного массива может вызвать исключение.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}
Никуль Патель
источник
Вложенного ifможно избежать, используя &&, как в image_array && image_array.lengthслучае короткого замыкания, если image_arrayне существует.
rvazquezglez
3

Я уверен, что некоторые из высоко оцененных ответов «работают», когда я помещаю их в jsfiddle, но когда у меня есть динамически генерируемый список массивов, большая часть этого кода в ответах просто не работает для меня.

Это то, что работает для меня.

var from = [];

if(typeof from[0] !== undefined) {
  //...
}

Заметьте, НЕТ кавычек не определено, и я не беспокоюсь о длине.

Том Стиккель
источник
1
два комментария: 1) typeofвозвращает строку, сравнение undefinedвсегда будет нечетким 2) вы не проверяете, fromопределен ли он. ваш код выше выдаст ошибку, если это не так
Xeltor
@Xeltor Нет, не будет. пожалуйста, предоставьте свой jsfiddle или plunker, чтобы доказать это или удалить свой комментарий.
Том Стиккель
@Xeltor, просто смотрю, и, похоже, в твоем ответе -2 и забита коментариями, люди, написавшие жирным шрифтом, что ты НЕПРАВИЛЬНО.
Том Стиккель
3

опциональная цепочка

Поскольку необязательное предложение по цепочке достигло стадии 4 и получило более широкую поддержку, есть очень элегантный способ сделать это

if(image_array?.length){

  // image_array is defined and has at least one element

}
LonelyCpp
источник
2

Я часто сталкиваюсь с этой проблемой в Javascript. Для меня лучший способ сделать это - поставить очень широкую проверку перед проверкой длины. Я видел некоторые другие решения в этом Q & A, но я хотел , чтобы иметь возможность проверить любой nullили undefinedили любое другое ложное значение.

if(!array || array.length == 0){
    console.log("Array is either empty or does not exist")
}

Это будет первым проверить undefined, nullили другие ложные ценности. Если какой-либо из них верен, он завершит логическое значение, так как это OR. Затем можно проверить более рискованную проверку array.length, которая может привести к ошибке, если массив не определен. Это никогда не будет достигнуто, если arrayесть undefinedили null, поэтому порядок условий очень важен.

Джим Фактор
источник
1

Ниже приведено мое решение, заключенное в функцию, которая также генерирует ошибки для управления парой проблем с областью действия объекта и всеми типами возможных типов данных, передаваемых в функцию.

Вот моя скрипка, используемая для изучения этой проблемы ( источник )

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}
Томми С.
источник
0

Если у вас нет переменной, объявленной как массив, вы можете создать проверку:

if(x && x.constructor==Array && x.length){
   console.log("is array and filed");
}else{
    var x= [];
    console.log('x = empty array');
}

Это проверяет, существует ли переменная x, и если это так, проверяет, является ли она заполненным массивом. иначе он создает пустой массив (или вы можете делать другие вещи);

Если вы уверены, что переменная массива создана, выполните простую проверку:

var x = [];

if(!x.length){
    console.log('empty');
} else {
    console.log('full');
}

Вы можете проверить мою скрипку здесь, показывая наиболее возможные способы проверки массива.

Plippie
источник
0

Вы должны сделать это

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }
Шивам Малхотра
источник
0

Я думаю, что этот простой код будет работать:

if(!(image_array<=0)){
//Specify function needed
}
Сачини Витхарана
источник
-1

в тс

 isArray(obj: any) 
{
    return Array.isArray(obj)
  }

в HTML

(photos == undefined ||! (isArray (photos) && photos.length> 0))

Velan
источник
3
Вы уверены, что? В конце концов, вторая часть не похожа на HTML
Nico Haase
-3

Когда вы создаете свой image_array, он пуст, поэтому ваш image_array.length равен 0

Как указано в комментарии ниже, я редактирую свой ответ на основе ответа на этот вопрос ):

var image_array = []

внутри скобок else ничего не меняется на image_array, определенный ранее в коде

Al_th
источник
У меня это в источнике, при загрузке страницы ... Просто забудьте опубликовать.
user1564141
Я хочу добавить что-то к своему ответу, что может быть неправильно, поэтому я заявляю это здесь. На общих языках то, что создано внутри блока, не видно "снаружи" блока. Как вы определяете []var image_array = []внутри блока else, я не уверен, что его можно увидеть снаружи. Попробуйтеimage_array = []
Al_th
но если я удаляю image_array из остального, все работает просто отлично.
user1564141