Array.keys() в JavaScript — ітератор ключів масиву


Опис

Метод keys() створює новий ітератор для масиву, що представляє ключі кожного елемента. Його основне призначення - допомогти вам пройтися по всіх ключах масиву, при цьому ігноруючи їхні значення. Важливо зауважити, що ітератор, що повертається методом keys(), не враховує прототипи масиву або інші властивості, які не є цілочисельними ключами.

Розглянемо наступний код:

let fruits = ['apple', 'banana', 'cherry'];
let keys = fruits.keys();

for (let key of keys) {
    console.log(key);
}

У цьому прикладі ми маємо масив fruits, який містить три елементи. Використовуючи метод keys(), ми отримуємо ітератор ключів (індексів). Після цього, за допомогою циклу for...of, ми виводимо кожний ключ (індекс) масиву у консоль, отримуючи послідовність чисел: 0, 1, 2.

Цей метод виявляється особливо корисним, коли використовується разом з іншими методами масиву, такими як map(), filter() та reduce().

автор: Bond

Загальний опис

автор: NagarD

Нотатка

Використання методу keys() дозволяє перебирати ключі масиву в циклі for...of або за допомогою ітератора next(). Це дозволяє отримати доступ до кожного ключа (індексу) масиву по черзі.

автор: Bond
Нотатка

Зверніть увагу, що ітератор, що створюється за допомогою методу keys(), враховує лише числові ключі з реальними значеннями, оминаючи пусті або видалені елементи. Якщо ж ви хочете отримати всі ключі, незалежно від їхнього стану (включаючи індекси пустих або видалених елементів), розгляньте можливість використання Array.prototype.entries().

автор: Bond
Нотатка

Зверніть увагу, що метод keys() повертає ітератор, а не сам масив ключів. Щоб отримати масив ключів, ви можете використати оператор spread (розподілу) або метод Array.from() для конвертації ітератора у масив.

автор: Bond
Нотатка

Метод keys() передбачає, що значення this міститиме властивість length і властивості з цілочисельними ключами.

автор: Bond
Нотатка

Для розріджених масивів (з пустими значеннями), keys() обходить всі порожні ячейки, розглядаючи їхні значення як undefined.

автор: Bond

Синтаксис

keys()

Повернення

object

Новий ітерабельний об'єкт.

автор: Bond

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
38 28 8 25 12
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
38 38 28 8
Підтримка: серверні переглядачі
Переглядач Node.js Deno
0.12.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

На відміну від Object.keys(), який включає лише ключі, що фактично існують у масиві, ітератор keys() не проігноровує порожні елементи, що представляють відсутні властивості.

const arr = ["a", , "c"];
const sparseKeys = Object.keys(arr);
const denseKeys = [...arr.keys()];
console.log(sparseKeys); // ['0', '2']
console.log(denseKeys); // [0, 1, 2]
автор: Bond

Метод keys() зчитує властивість length даного об'єкта і повертає всі цілочисельні індекси від 0 до length - 1. Фактичного доступу до індексів не відбувається.

const arrayLike = {
  length: 3,
};

for (const entry of Array.prototype.keys.call(arrayLike)) {
  console.log(entry);
}
// 0
// 1
// 2
автор: Bond

Даний приклад демонструє використання методу keys() на масиві для отримання ключів ітератора. Ми проходимося по кожному ключу ітератора та виводимо їх на сторінку.

HTML

<header>
  <h2 class="title">Приклад використання методу keys()</h2>
  <p class="description">Демонстрація використання методу keys() на масиві для отримання ключів ітератора</p>
</header>
<main>
  <pre>['a', 'b', 'c']</pre>
  <div id="output"></div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

pre {
  color: #ff0000;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

main {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 200px;
}

div#output {
  background-color: #f9f9f9;
  padding: 10px;
  border: 1px solid #ccc;
  border-radius: 5px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 0.5);
}

JS

const array1 = ['a', 'b', 'c'];
const iterator = array1.keys();
let output = '';

for (const key of iterator) {
  output += 'Ключ: ' + key + ' | Значення: ' + array1[key] + '<br>';
}

document.getElementById('output').innerHTML = output;
//# sourceURL=pen.js
автор: Bond

Прогін показує, чим arr.keys() відрізняється від масиву й від Object.keys(), як він вичерпується після першого проходу і як поводиться з дірками. У кінці — привітніша заміна через entries().

const fruits = ['яблуко', 'банан', 'вишня'];

const it = fruits.keys();
console.log('це не масив:', Array.isArray(it), '/ що це:', String(it)); // false / [object Array Iterator]
console.log('length у ітератора:', it.length);                          // undefined

// масив індексів дає розкладання або Array.from
console.log('розкладання:', [...fruits.keys()]);                        // [0,1,2]
console.log('типи ключів у keys():', [...fruits.keys()].map((k) => typeof k).join(', ')); // number, number, number

// ⚠️ ітератор одноразовий: після проходу він порожній
const once = fruits.keys();
console.log('перший прохід:', [...once]);                               // [0,1,2]
console.log('другий прохід того самого ітератора:', [...once]);         // []

// keys() у масиву — це індекси-числа; Object.keys() — РЯДКИ і ще й зайві властивості
const list = ['a', 'b'];
list.color = 'червоний';
console.log('Object.keys():', Object.keys(list));                       // ["0","1","color"]
console.log('list.keys():', [...list.keys()]);                          // [0,1]
console.log('типи в Object.keys():', Object.keys(list).map((k) => typeof k).join(', ')); // string, string, string

// дірки: keys() рахує їх, forEach — пропускає
const sparse = [1, , 3];
const visited = [];
sparse.forEach((v, i) => visited.push(i));
console.log('keys() у розрідженому:', [...sparse.keys()], '/ forEach обійшов:', visited); // [0,1,2] / [0,2]

// разом з entries() зазвичай зручніше
for (const [i, name] of fruits.entries()) {
    console.log('entries:', i, name);                                   // 0 яблуко / 1 банан / 2 вишня
}

// у рядка методу keys() немає взагалі
try {
    'абв'.keys();
} catch (e) {
    console.log('у рядка keys() немає:', e.name);                       // TypeError
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід