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