遍历对象
创建一个生成器,用于遍历给定对象的所有键。
- 使用递归。
- 定义一个生成器函数
walk
,接受一个对象和一个键数组作为参数。 - 使用
for...of
循环和Object.keys()
遍历对象的键。 - 使用
typeof
检查给定对象中的每个值是否为对象。 - 如果是对象,则使用
yield*
表达式递归委托给同一个生成器函数walk
,将当前的key
添加到键数组中。否则,使用yield
返回表示当前路径和给定key
的值的键数组。 - 使用
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);
};
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]
]
*/