Перевірте, чи масив порожній чи існує


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; ?>

Журнал консолі image_array- що ви отримуєте?
Utkanos

@Utkanos, якщо є var image_array = [] - невизначено, якщо // var image_array = [] (коментується) - реальний масив.
користувач1564141

масив? .length - широко підтримується, і незабаром стане рідною функцією
Anbu Agarwal

Відповіді:


516
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
}

33
Ні. Це буде вибуховим, коли image_array є недійсним. Закон Мерфі говорить, що одного дня це станеться.
Марко Фаустінеллі

7
Не image_array.lengthвистачає? (без вказівки >0)
mcont

Цікаво: Чи можете ви знайти будь-який випадок використання, який би порушив використання відповіді @JamesDrinkard?
цемер

11
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 - це змінна, якій ви ще нічого не призначили.

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

Case Null
Взагалі кажучи, null є станом, який не має значення. Наприклад, змінна є нульовою, коли ви пропустили або не змогли отримати деякі дані.

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

Case Not a 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
}

1
Re .. && image_array.length). IMHO, хоча ви можете спокійно розраховувати на слабке введення 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 #, щоб звикнути, якщо (obj) перевіряти на null, але тепер я люблю це: if (obj) // null check; якщо (масив && array.length) // масив нульовий або порожній перевірити; якщо (масив &&! array.length) // масив існує, але перевірити порожнє; if (str) // рядок не нульовий і не порожній. Єдиний gotcha - це не використовувати для чисел, якщо нуль - дійсне число.
Rick Love

1
Я деякий час використовував (arrayName && arrayName.length), тоді я хвилювався, чи може щось не так. Ця відповідь мене втішила, дякую :)
Корай

У Typescript є нюанси, оскільки для var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0типу для isNotEmpty не було б булевим, було б булевим | невизначеним.
Гіедрюс

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
}


@ user1564141 важко сказати, де оголошується функція відносно встановленого вами image_array. У вас може виникнути проблема з хостингом, тому вам може знадобитися оголосити цю змінну як var index_array = ... Крім того, тег сценарію, у якому ви встановлюєте, закрити index_array закритий. Це не відображається на скріншоті.
Майк Брант

В іншому також насторожено, яке спрацьовує лише тоді, коли масив порожній, але var image_array працює кожен раз ... Не можу зрозуміти, чому?
користувач1564141

@ user1564141 Це допоможе, якщо ви можете оновити своє запитання, щоб показати джерело як вихід. Я досі не відчуваю, де ваша логіка if-else знаходиться в межах джерела відносно розташування вашої декларації index_array.
Майк Брант

6

JavaScript

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

Лодаш і підкреслення

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

6

Ви можете використовувати jQuery's, 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/


Це єдине, що працювало для мене при додаванні елементів з array.push () - з динамічно доданих елементів (ajax). Дякую
TomoMiha

3

Простий спосіб, який не призводить до винятків, якщо не існує, і перетворюється на булевий:

!!array

Приклад:

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

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, і повна коментарів з людьми, які в BOLD заявляють, що ви помиляєтесь.
Том

3

необов'язковий ланцюжок

Оскільки факультативна пропозиція ланцюга досягла 4 стадії і отримує більш широку підтримку, є дуже елегантний спосіб зробити це

if(image_array?.length){

  // image_array is defined and has at least one element

}

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

Ви можете перевірити мою загадку тут, показуючи найбільш можливі способи перевірити масив.


0

Ви повинні це зробити

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

-1

в ц

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

в html

(фотографії == undefined ||! (isArray (фотографії) && photos.length> 0))


3
Ви впевнені в цьому? Друга частина все-таки не схожа на HTML
Ніко Хааз,

-3

Коли ви створюєте image_array, він порожній, тому ваша image_array.length дорівнює 0

Як зазначено в коментарі нижче, я редагую свою відповідь на основі відповіді на це запитання ):

var image_array = []

всередині інших дужок нічого не змінює зображення, визначене раніше в коді


Я маю це в джерелі, при завантаженні сторінки ... Просто забудьте дописувати.
користувач1564141

Я хочу додати у свою відповідь щось, що може бути неправильним, тому я заявлю це тут. У загальних мовах те, що створюється всередині блоку, не видно «поза» блоку. Як ви визначаєте []var image_array = []всередині іншого блоку, я не впевнений, що його можна було побачити зовні. Спробуйтеimage_array = []
Al_th

але якщо я видаляю image_array з іншого, все працює чудово.
користувач1564141
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.