gpt4 book ai didi

javascript - 从从数组创建的生成器列表中产生

转载 作者:可可西里 更新时间:2023-11-01 02:09:10 24 4
gpt4 key购买 nike

我有这个递归生成器

var obj = [1,2,3,[4,5,[6,7,8],9],10]

function *flat(x) {
if (Array.isArray(x))
for (let y of x)
yield *flat(y)
else
yield 'foo' + x;

}

console.log([...flat(obj)])

它工作正常,但我不喜欢 for 部分。有没有办法在功能上编写它?我试过了

if (Array.isArray(x))
yield *x.map(flat)

这没用。

有没有办法不用for循环来写上面的函数?

最佳答案

你可以使用 rest parameters ...并检查剩余数组的长度以进行另一次生成器调用

function* flat(a, ...r) {
if (Array.isArray(a)) {
yield* flat(...a);
} else {
yield 'foo' + a;
}
if (r.length) {
yield* flat(...r);
}
}

var obj = [1, 2, 3, [4, 5, [6, 7, 8], 9], 10];
console.log([...flat(obj)])
.as-console-wrapper { max-height: 100% !important; top: 0; }

类似的方法,但使用 spread 生成器来调用具有展开值的移交生成器。

function* spread(g, a, ...r) {
yield* g(a);
if (r.length) {
yield* spread(g, ...r);
}
}

function* flat(a) {
if (Array.isArray(a)) {
yield* spread(flat, ...a);
} else {
yield 'foo' + a;
}
}

var obj = [1, 2, 3, [4, 5, [6, 7, 8], 9], 10];
console.log([...flat(obj)])
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 从从数组创建的生成器列表中产生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45708712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com