Введение
В этом практическом занятии мы изучим концепцию создания генераторной функции, которая обходит все ключи заданного объекта с использованием рекурсии. Цель этого практического занятия - дать студентам возможность получить на практике понимание того, как использовать выражения yield и yield* в сочетании с циклами for...of и методом Object.keys() для итерации по ключам объекта и их значениям. В конце этого практического занятия студенты получат практическое представление о том, как рекурсивно обходить объект и генерировать массив ключей, представляющих текущий путь и соответствующие значения.
Обход ключей объекта
Для генерации списка всех ключей заданного объекта используйте следующие шаги:
Откройте Терминал/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]
]
*/
Резюме
Поздравляем! Вы завершили практическое занятие по обходу объекта. Вы можете выполнить больше практических заданий в LabEx, чтобы улучшить свои навыки.