Как проверить в JavaScript, существует ли значение в определенном индексе массива?

521

Будет ли это работать для проверки, существует ли значение в позиции «индекс» или нет, или есть лучший способ:

if(arrayName[index]==""){
     // do stuff
}
Анкур
источник
6
Обратите внимание, не желая проверять, является ли весь массив пустым, просто определенное место, которое имеет значение индекса "index"
Ankur
Заголовок можно улучшить, сказав «Как проверить в JavaScript, существует ли значение в определенном индексе массива».
demisx

Ответы:

738

Концептуально массивы в 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
}  
thomasrutter
источник
6
Весьма вероятно, что ОП знает, с каким массивом он / она имеет дело, но только для полноты: объекты, подобные массиву, также обычно содержат lengthсвойство, и в этом случае более поздние два примера являются более подходящими.
Джастин Джонсон
9
Вы всегда можете заменить foo !== 'undefined' && foo !== nullпростоfoo != null
thinklinux
1
@TheComposer в соответствии с языком, размер массива в Javascript определяется array.length, и говорят, что массив содержит все элементы из 0to array.length - 1. Не все из этих значений будут определенными значениями. Если вы используете ключевое слово delete в элементе массива, оно вернет этот элемент обратно неопределенным, как если бы вы расширяли массив путем увеличения его параметра array.length, новые значения начинаются как неопределенные. В действительности реализации Javascript, вероятно, оптимизируют хранение массива, и некоторые или все неопределенные значения могут не занимать память.
Томасруттер
1
array.length ничего не повторяет, это всего лишь одно число.
Томасруттер
1
Этот ответ не охватывает случаи, когда индекс массива не установлен. new Array(1)[0] === undefinedно значение пусто. [undefined][0] === undefinedно значение установлено; массив имеет значение. Единственный идеальный ответ , используя inили hasOwnProperty()- idx in arrayили array.hasOwnProperty(idx): --per этот ответ stackoverflow.com/a/39171620/3120446
dx_over_dt
350

Разве мы не можем просто сделать это:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}
Мади
источник
10
Вопрос был о том, как проверить, существует ли определенный индекс массива или нет.
Томасруттер
26
Будет ли if(arrayName.length) {...какая-то разница?
siannone
10
Почему так много голосов? Это явно не отвечает на вопрос.
algiogia
10
if(arrayName.length) {...терпит неудачуnull
Ронни Ройстон
5
это терпит неудачу с [undefined, undefined]массивом с длиной = 2.
Soldeplata Saketos
41

Использование только .lengthне является безопасным и приведет к ошибке в некоторых браузерах. Вот лучшее решение:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

или мы можем использовать:

Object.keys(__array__).length
Joni
источник
2
«Пожалуйста, обратите внимание, не желая проверять, является ли весь массив пустым, просто определенное место, которое имеет значение индекса« index »»
Oriol
хороший, короткий и простой ответ для тех, кто хочет проверить весь массив
Луис Мартинс
23
if(!arrayName[index]){
     // do stuff
}
x2.
источник
8
Это также будет делать, если значение массива существует, но оно равно 0, нулю, "" и т. Д.
thomasrutter
Томас прав; однако этого достаточно для многих случаев (которые вы, вероятно, должны перечислить).
Джастин Джонсон
безусловно, самый простой способ
выключатель
8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}
Рекс М
источник
@thomasrutter У меня проблемы с поиском способа, которым можно было бы получить элемент массива, который не определен.
Рекс М
Хм, работает (myarray [1] = undefinedvariable)? Или просто (myarray [1] = не определено)?
Томасруттер
@thomasrutter, оба из них бросили бы исключение, не так ли? (неопределенная переменная не определена)
Рекс М
1
Вы можете проверить это для себя, используя что-то вроде Firebug. В Javascript чтение значения неопределенной переменной не вызывает исключения - оно возвращает неопределенное значение.
Томасруттер
@thomasrutter, ты ошибаешься в своем первом комментарии. x == nullбудет когда-либо только для нуля или неопределенного, ничего больше. Точно так же x != nullбудет верно для всего, что не является ни нулевым, ни неопределенным. Если вам специально не нужно искать неопределенное, просто склоняйтесь к неявной доброте преобразования.
Маркус Стаде
8

Краткий и универсальный подход

Если вы хотите проверить любой массив, если он имеет ложные значения (например, false, undefined, null или пустые строки), вы можете просто использовать метод each () следующим образом:

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
}
indreed
источник
6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

Если вы имеете в виду «Null» -> его элементы равны нулю или равны «», в этом случае: проверьте, не пуст ли массив после фильтрации всех «нулевых» элементов

if(!arr.clean().length){return 'is null'}

Конечно, добавьте метод Clean перед:

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}
Абденнур ТУМИ
источник
5

Я бы порекомендовал создать такую ​​функцию:

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.

Вы получаете ошибку, если значения массива или индекса не существуют.

Для правильного ввода вы получите значение true, только если arrayName [indexVal]:

  • значение NULL
  • не определено
  • NaN
  • пустой строкой
  • 0
  • ложный
L3x
источник
5

Это зависит от того, что вы имеете в виду под «пустым».

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

Ориоль
источник
2
Это единственный ответ, который правильно разделяет неустановленные элементы массива (которые не имеют никакого значения) и элементы, для которых установлено неопределенное значение. Эти 2 состояния размыты тем фактом, что доступ к неустановленному элементу массива возвращает неопределенное значение, но они различны.
olivr
Используйте hasOwnProperty, когда у вас есть массив с потенциально неустановленными значениями (отличными от неопределенных или нулевых).
CMCDragonkai
1

Хорошо, давайте сначала посмотрим, что произойдет, если значение массива не существует в 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 есть, он не распознается, есть несколько других вещей, которые могут сделать то же самое и сделать ваше приложение глючным, поэтому будьте осторожны, я перечислю их все:

  1. undefined : если значение не определено и оноundefined
  2. нуль : если это ноль, например, если элемент DOM не существует ...
  3. пустая строка :''
  4. 0 : число ноль
  5. NaN : не число
  6. ложный
Алиреза
источник
1

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

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
}
Бенуа Ранк
источник
0

попробуйте это, если массив [индекс] является нулем

if (array[index] != null) 
Kishan
источник
0

С Lodash вы можете сделать:

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можно было продолжить другие подобные вещи.

Нетронутый Каллио
источник
0

Чтобы проверить, был ли он никогда не определен или был удален:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

также работает с ассоциативными массивами и массивами, где вы удалили некоторый индекс

Чтобы проверить, не было ли оно никогда не определено, было ли удалено ИЛИ пустое или логическое пустое значение (NaN, пустая строка, false):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}
Лука С.
источник
0

Я столкнулся с этой проблемой, используя данные Laravel. Я сохранял значение JSON, вызываемое propertiesв журнале активности, и хотел показать кнопку, основанную на том, что это значение пустое или нет.

Что ж, datatables интерпретировал это как массив, если он был пустым, и как объект, если это не так, поэтому мне помогло следующее решение:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

У объекта нет свойства длины.

kjdion84
источник
0

Я думаю, что это решение подходит для парней, которые предпочитают декларативное функциональное программирование, а не императивное ООП или процедурное. Если ваш вопрос « Есть ли какие-то значения внутри? (Истинное или ложное значение)», вы можете использовать .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
Пурхало Алекс
источник
-1

Вы можете использовать библиотеку Loadsh, чтобы сделать это более эффективно, например:

если у вас есть массив с именем "pets", например:

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/

alvaropaco
источник
fn(){}является синтаксической ошибкой, и не совсем понятно, как это помогает проверить, существует ли элемент массива по определенному индексу или нет.
Ориоль