Чи вдасться це перевірити, чи існує значення в позиції "індекс" чи немає, чи є кращий спосіб:
if(arrayName[index]==""){
// do stuff
}
Чи вдасться це перевірити, чи існує значення в позиції "індекс" чи немає, чи є кращий спосіб:
if(arrayName[index]==""){
// do stuff
}
Відповіді:
Концептуально масиви в JavaScript містять array.length
елементи, починаючи з array[0]
до array[array.length - 1]
. Елемент масиву з індексом i
визначається як частина масиву, якщо він i
знаходиться між 0
і array.length - 1
включно. Якщо я не в цьому діапазоні, він не знаходиться в масиві.
Отже, за принципом, масиви є лінійними, починаючи з нуля і йдучи до максимуму, без жодного механізму наявності "прогалин" всередині цього діапазону, де немає записів. Щоб дізнатись, чи існує значення в заданому індексі позиції (де індекс дорівнює 0 або додатне ціле число), ви буквально використовуєте
if (i >= 0 && i < array.length) {
// it is in array
}
Тепер, під капотом, двигуни JavaScript майже напевно не будуть розподіляти простір масиву лінійно та безперервно, як це, оскільки це не має особливого сенсу в динамічній мові, і це буде неефективним для певного коду. Вони, ймовірно, мають хеш-таблиці або якусь гібридну суміш стратегій, а невизначені діапазони масиву, ймовірно, не виділяють власну пам’ять. Тим не менш, JavaScript мовою хоче представити масиви з array.length
n як такі, що мають n членів, і вони названі від 0 до n - 1 , і все, що в цьому діапазоні є частиною масиву.
Ти, мабуть, хочеш, але це знати, чи значення в масиві насправді щось визначене - тобто це не так undefined
. Можливо, ви навіть хочете знати, чи визначено це, чи ніnull
. Можна додати членів до масиву, не встановлюючи їх значення: наприклад, якщо ви додаєте значення масиву, збільшуючи array.length
властивість, будь-які нові значення будуть undefined
.
Визначити, чи є дане значення чимось значущим, чи було визначене. Тобто ні undefined
, або null
:
if (typeof array[index] !== 'undefined') {
або
if (typeof array[index] !== 'undefined' && array[index] !== null) {
Цікаво, що через правила порівняння JavaScript, мій останній приклад можна оптимізувати до цього:
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
властивість, і в цьому випадку наступні два приклади є більш підходящими.
foo !== 'undefined' && foo !== null
простоfoo != null
0
до array.length - 1
. Однак не всі ці значення будуть визначеними значеннями. Якщо ви використовуєте ключове слово delete для члена масиву, воно поверне його до невизначеного, як і якщо розширити масив, збільшивши його параметр array.length, нові значення почнуть не визначатися. Насправді реалізація Javascript, ймовірно, оптимізує сховище масиву, і деякі або всі невизначені значення можуть не займати пам'яті.
new Array(1)[0] === undefined
але значення порожнє. [undefined][0] === undefined
але значення встановлено; масив має значення. Єдиний ідеальний відповідь , використовуючи in
або hasOwnProperty()
- idx in array
або array.hasOwnProperty(idx)
: --per ця відповідь stackoverflow.com/a/39171620/3120446
Чи не можемо ми просто так:
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
б якесь значення?
if(arrayName.length) {...
виходить з ладуnull
[undefined, undefined]
це масив довжиною = 2.
Використання лише .length
не є безпечним і призведе до помилки в деяких браузерах. Ось краще рішення:
if(array && array.length){
// not empty
} else {
// empty
}
або ми можемо використовувати:
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
буде вірно тільки для нульового або невизначеного, нічого іншого. Так само x != null
буде справедливо для будь-якого, що не є ні нульовим, ні визначеним. Якщо вам конкретно не потрібно шукати невизначеного, просто спирайтеся на неявну конверсійну доброту.
Короткий і універсальний підхід
Якщо ви хочете перевірити будь-який масив, чи є у нього помилкові значення (наприклад, помилкові, невизначені, нульові чи порожні рядки), ви можете просто скористатися кожним методом () таким:
array.every(function(element) {return !!element;}); // returns true or false
Наприклад:
['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true
Якщо вам потрібно отримати перший показник помилкового значення, ви можете зробити це так:
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
Якщо вам просто потрібно перевірити помилкове значення масиву для заданого індексу, ви можете це зробити так:
if (!!array[index]) {
// array[index] is a correct value
}
else {
// array[index] is a falsy value
}
if(typeof arr ==='object' && arr instanceof Array ){
if(!arr.length){
println 'empty'
}else{
printn 'not Empty'
}
}else{
println 'Null'
}
Якщо ви маєте на увазі під «Null» -> Його елементи є null або дорівнює '', в цьому випадку: Перевірте, чи масив порожній після фільтрації всіх елементів 'null'
if(!arr.clean().length){return 'is null'}
Звичайно, додати метод очищення раніше:
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
Я рекомендую створити таку функцію:
function isEmptyEl(array, i) {
return !(array[i]);
}
Ви можете назвати це так:
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
Примушуючи розробника дотримуватися інтерфейсу isEmptyEl, вони вловлюють помилки введення, такі як невизначений змінний arrayName або indexVal.
(Зазвичай, це хороша практика програмувати захисно при програмуванні в Javascript.)
Ви отримаєте помилку, викинуту таким чином, якщо arrayName не визначено:
Uncaught ReferenceError: arrayName is not defined
at <anonymous>:2:15
at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
Аналогічні результати для невизначеного indexVal.
Ви отримуєте помилку, якщо значення масиву чи індексу не існують.
Для дійсного введення, ви отримаєте істинне лише у тому випадку, якщо arrayName [indexVal] має будь-яку з наведених нижче дій:
Це залежить від того, що ви маєте на увазі під "порожнім".
При спробі отримати значення властивості для об'єкта, який не має властивості з таким ім'ям, ви отримаєте значення undefined
.
Ось що відбувається з розрідженими масивами: не всі індекси між 0
і array.length-1
існують.
Тож ви могли перевірити, чи є array[index] === undefined
.
Однак властивість index
може існувати зі undefined
значенням. Якщо ви хочете відфільтрувати цей випадок, ви можете скористатися in
оператором або hasOwnProperty
, як описано в розділі Як перевірити, чи має об’єкт властивість у JavaScript?
index in array;
array.hasOwnProperty(index);
Якщо ви хочете вважати, що існуюча властивість із значенням undefined
або null
значенням не існує, ви можете скористатися нестабільним порівнянням array[index] == undefined
абоarray[index] == null
.
Якщо ви знаєте , що маса не розріджений, ви могли б порівняти index
з array.length
. Але для безпеки ви можете переконатися, що це index
дійсно індекс масиву, див. Перевірте, чи ім'я властивості - це індекс масиву
Добре, давайте спочатку подивимося, що буде, якщо значення масиву в JavaScript не існує, тож якщо у нас є масив, як показано нижче:
const arr = [1, 2, 3, 4, 5];
і тепер ми перевіряємо, чи є 6 в індексі 5 чи ні:
arr[5];
і ми отримуємо
undefined
...
Отже, це в основному дає нам відповідь, найкращий спосіб перевірити, чи не визначено, так щось подібне:
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
У цьому випадку НЕ робити цього:
if(!arrayName[index]) {
//Don't check like this..
}
Тому що уявіть, у нас є цей масив:
const arr = [0, 1, 2];
і ми робимо:
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
Отже, як ви бачите, навіть 0 є, він не впізнається, є кілька інших речей, які можуть зробити те саме, і зробити вас додатком помилковим, тому будьте обережні, я перераховую їх усіх:
undefined
''
Я хотів би зазначити те, що деякі, здається, пропустили: а саме в середині вашого масиву можливе розташування "порожнього" масиву. Розглянемо наступне:
let arr = [0, 1, 2, 3, 4, 5]
delete arr[3]
console.log(arr) // [0, 1, 2, empty, 4, 5]
console.log(arr[3]) // undefined
Природним способом перевірки було б потім побачити, чи не визначено член масиву, я не впевнений, чи існують інші способи
if (arr[index] === undefined) {
// member does not exist
}
З Лодашем ви можете:
if(_.has(req,'documents')){
if (req.documents.length)
_.forEach(req.documents, function(document){
records.push(document);
});
} else {
}
if(_.has(req,'documents'))
полягає в тому, щоб перевірити, чи є у нашого об’єкта запиту властивість, іменоване, documents
і чи є у нього відповідна опора, наступне if (req.documents.length)
- перевірити, якщо це не порожній масив, тож інші елементи, подібні до цього, forEach
можна продовжити.
Щоб перевірити, чи він ніколи не був визначений чи його видалено:
if(typeof arrayName[index]==="undefined"){
//the index is not in the array
}
також працює з асоціативними масивами та масивами, де ви видалили деякий індекс
Щоб перевірити, чи ніколи не було визначено, було видалено АБО - це нульове або логічне порожнє значення (NaN, порожня рядок, помилка):
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
Я зіткнувся з цією проблемою за допомогою даних даних про laravel. Я зберігав значення JSON, викликане properties
в журналі активності, і хотів показати кнопку, засновану на тому, що це значення порожнє чи ні.
Що ж, таблиці даних інтерпретували це як масив, якщо він порожній, і об'єкт, якщо його немає, тому для мене працювало таке рішення:
render: function (data, type, full) {
if (full.properties.length !== 0) {
// do stuff
}
}
Об'єкт не має властивості довжини.
Я вважаю, що це рішення підходить для хлопців, які віддають перевагу декларативному функціональному програмуванню над імперативним ООП або процедурним. Якщо у вас запитання " Чи є якісь значення всередині? (Truthy або хибне значення)", ви можете використовувати .some
метод для перевірки значень всередині.
[].some(el => el || !el);
function isEmpty(arr) { ... }
.[].length
внаслідок 0
чого це небезпечно в деяких випадках.[].length > 0
приказка "Чи довжина її більша за нуль?"Розширені приклади:
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
Ви можете скористатися бібліотекою Cargoh, щоб зробити це більш ефективно, наприклад:
якщо у вас є масив з назвою "домашні тварини", наприклад:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
Щоб перевірити всі значення масиву на нульові або невизначені значення:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Перегляньте більше прикладів на http://underscorejs.org/
fn(){}
є синтаксичною помилкою, і зовсім не ясно, як це допомагає перевірити, чи існує елемент масиву в певному індексі чи ні.