JavaScript | Как проверить «дырку» в массиве?

JavaScript | Как проверить «дырку» в массиве?

 

Как узнать, есть ли неопределённые элементы в массиве?

У нас есть массив:

var massiv = [1,,2,3]
Массив с дыркой - JavaScript
Массив с дыркой — JavaScript

Мы видим, что значения элемента под индексом 1 не существует. То есть значение этого элемента не было объявлено. Если мы попытаемся обратиться к значению элемента массива под индексом 1, то мы получим undefined

Обратились к не объявленному элементу массива - JavaScript
Обратились к не объявленному элементу массива — JavaScript

Мы хотим понять, пропущен ли в оригинальном массиве какой-нибудь элемент или нет? Это полный массив или не полный? Как это сделать?

 

Решение

Можно взять метод filter() для объектов-прототипов Array и отобрать значения, которые не равны undefined. А затем нужно просто сравнить длины двух массивов.

  • Если длины разные, значит в массиве есть дырка.
  • Если длины совпадают, значит массив полный и дырок в нём нет.
massiv.filter(i=>i!=undefined).length == massiv.length
false
Длины массивов не совпадают - значит есть дырка - JavaScript
Длины массивов не совпадают — значит есть дырка — JavaScript

В нашем случае выражение вернуло false, а значит длины не совпадают и в массиве есть неопределённые элементы. Задача выполнена.

 

Информация из стандарта ECMAScript

Элементы массива могут быть опущены в начале, середине или конце списка элементов. Каждый раз, когда запятой в списке элементов не предшествует AssignmentExpression (т.е. запятая в начале или после другой запятой), отсутствующий элемент массива способствует увеличению длины массива и увеличивает индекс последующих элементов. Исключаемые элементы массива не определены (not defined). Если элемент опущен в конце массива, этот элемент не влияет на длину массива.

 

Информационные ссылки

JavaScript | empty элемент массива

Стандарт ECMAScript — Раздел «13.2.5 Array Initializer» — https://tc39.es/ecma262/#sec-array-initializer