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

Когда страница загружается в первый раз, мне нужно проверить, есть ли изображение в 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; ?>

Ответ 1

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
}

Ответ 2

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

Современный способ, 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

Зачем?

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

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

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

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

Дело не массив
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

Ответ 3

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

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

Ответ 4

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

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

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

if(arrayName && arrayName.length)

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

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

console.log(массив1); console.log(массив2); 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!");
}

Тогда результаты:

undefined

[]

[ "один", "два", "три" ]

нулевым

и заключительный тест, показывающий

if(array2 && array2.length){

совпадает с

if(array2 && array2.length > 0){

array3! имеет значение!

Ответ 5

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

  if (image_array !== undefined && image_array.length > 0)

Ответ 6

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

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}

Ответ 7

Вы можете использовать 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/

Ответ 8

JavaScript

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

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

( _.isArray(myArray) && myArray.length > 0 )

Ответ 9

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

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

var from = [];

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

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

Ответ 10

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

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}

Ответ 11

Я часто сталкиваюсь с этой проблемой в 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, которая может вызвать ошибку, если массив undefined. Этого никогда не достичь, если array undefined или null, поэтому очень важно упорядочить условия.

Ответ 12

Использование undescore или lodash:

_.isArray(image_array) && !_.isEmpty(image_array)

Ответ 13

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

!!array

Пример:

if (!!arr) {
  // array exists
}

Ответ 14

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

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');
}

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

Ответ 15

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

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }

Ответ 16

Попробуйте ниже,

if(array.results != undefined) - specific to SharePoint

или

if(array.length > 0)

Ответ 17

Здесь мой, чтобы добавить к длинному списку ответов:

во-первых, проверка на length недостаточна для проверки типа, так как

const fakeArray1 = { length: "very long" };
const fakeArray2 = { length: "1337", data: {} };
if (fakeArray1.length) {...} // is true
if (fakeArray2.length > 0) {...} // is also true

поэтому вам нужно проверить реальный тип, либо

image_array.constructor === Array или Array.isArray(image_array)

Теперь волшебство (примечание: использование магии в JS опасно и требует ловкости и ответственности), при использовании нетипизированного сравнения любая пара равенства ниже правна

[] == false; [] == 0; [] == ''; [null] == false

Итак! это становится выходом: P

МОЙ ОТВЕТ

if(Array.isArray(image_array) && image_array == false) {
  // handle the case where, either
  // - the array don't exist
  // - the array is empty
  // - it contains only one empty element
}

Примечание: (и советуем)

использование нетипизированной проверки считается плохой практикой в ​​JS, и кто-то может захотеть добавить третий =, изменив поведение вашего кода. Я советую тогда обернуть эту проверку в функцию утилиты, чтобы она не попадала в вашу логику и пропущенность, понятную сверстниками.

Ответ 18

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

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

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);
}

Ответ 19

в тс

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

в HTML

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

Ответ 20

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

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

var image_array = []

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