我在一个大数组上使用 lodash group by, 该操作需要几分钟,这使得所有其他异步承诺者都挨饿 (因为我们没有发布上下文)
有人建议使用不同的库\修改我对 groupBy 的使用来解决这个问题吗?
所以 groupBy 只是
function groupBy<T, V extends PropertyKey>(
list: T[], get: (v:T) => V,
): Record<V, T[]> {
const r = {} as Record<V, T[]>
for (const el of list) {
(r[get(el)] ??= []).push(el)
}
return r
}
如果时间太长,您可以轻松添加拦截器来等待:
async function groupBy<T, V extends PropertyKey>(
list: T[], get: (v:T) => V,
): Record<V, T[]> {
const r = {} as Record<V, T[]>
let now = performance.now()
for (const el of list) {
// if `get` is fast, better to smth like `if (i%100==0)` here
if (performance.now() - now > 10 /*ms*/) {
// break the execution
await new Promise(setTimeout) // or whatever waiting function
now = performance.now()
}
(r[get(el)] ??= []).push(el)
}
return r
}