Обход ключей объекта
Для генерации списка всех ключей заданного объекта используйте следующие шаги:
-
Откройте Терминал/SSH и введите node
, чтобы начать практиковаться в написании кода.
-
Определите генераторную функцию под названием walk
, которая принимает объект и массив ключей. Используйте рекурсию для обхода всех ключей объекта.
-
Внутри функции walk
используйте цикл for...of
и метод Object.keys()
для итерации по ключам объекта.
-
Используйте typeof
, чтобы проверить, является ли каждое значение в заданном объекте объектом. Если значение является объектом, используйте выражение yield*
, чтобы рекурсивно делегировать к той же генераторной функции walk
, добавляя текущий ключ
к массиву ключей.
-
В противном случае yield
массив ключей, представляющий текущий путь и значение заданного ключа
.
-
Используйте выражение yield*
, чтобы делегировать к генераторной функции walk
.
Вот код:
const walkThrough = function* (obj) {
const walk = function* (x, previous = []) {
for (let key of Object.keys(x)) {
if (typeof x[key] === "object") yield* walk(x[key], [...previous, key]);
else yield [[...previous, key], x[key]];
}
};
yield* walk(obj);
};
Для проверки кода создайте объект и используйте функцию walkThrough
, чтобы сгенерировать список всех его ключей:
const obj = {
a: 10,
b: 20,
c: {
d: 10,
e: 20,
f: [30, 40]
},
g: [
{
h: 10,
i: 20
},
{
j: 30
},
40
]
};
[...walkThrough(obj)];
/*
[
[['a'], 10],
[['b'], 20],
[['c', 'd'], 10],
[['c', 'e'], 20],
[['c', 'f', '0'], 30],
[['c', 'f', '1'], 40],
[['g', '0', 'h'], 10],
[['g', '0', 'i'], 20],
[['g', '1', 'j'], 30],
[['g', '2'], 40]
]
*/