Skip to content

Commit 85ccca4

Browse files
authored
Добавляет ответ про подсчёт пустых слотов в массиве (#5614)
1 parent ccce4e0 commit 85ccca4

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed
Loading
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
В JavaScript массивы — это не отдельный тип данных, а просто [объекты](/js/objects-objects-everywhere/). Заполненные слоты массива хранятся под числовыми ключами, а пустые слоты вообще не существуют.
2+
3+
В консоли Chrome Dev Tools пустые слоты отображаются как `empty`, а в Node.js — `empty items`. Но это лишь абстрактное представление ситуации, когда поле `.length` массива не совпадает с ожидаемыми заполненными слотами.
4+
5+
![Пример отображение empty slots](images/empty.png)
6+
7+
Чтобы проверить наличие значения по ключу, можно использовать оператор `in` или метод `.hasOwnProperty()`:
8+
9+
```js
10+
const test = new Array(5)
11+
test[2] = 42
12+
13+
2 in test // true
14+
test.hasOwnProperty(2) // true
15+
16+
0 in test // false
17+
test.hasOwnProperty(0) // false
18+
```
19+
20+
То есть, мы можем пройтись по массиву от `0` до `length` и проверить отсутвие текущего индекса в качестве ключа. Однако есть способ ещё проще: [итератор](/js/iterator/) массива и методы, поверх него, используют только существующие ключи:
21+
22+
```js
23+
const test = new Array(5)
24+
test[2] = 42
25+
26+
test.forEach((value, key) => console.log(`значение по ключу ${key}: ${value}`))
27+
// значение по ключу 2: 42
28+
29+
// консоль вывела значение только один раз
30+
```
31+
32+
Таким образом, чтобы найти количество пустых слотов, достаточно от длины массива отнять число заполненных значений:
33+
34+
```js
35+
const calcEmpty = items => items.reduce(amount => --amount, items.length)
36+
37+
const test = new Array(5)
38+
39+
test[2] = 42
40+
calcEmpty(test) // 4
41+
42+
test[10] = 2
43+
calcEmpty(test) // 9
44+
```

0 commit comments

Comments
 (0)