我有一个 flatMap 函数,可以获取并返回数组中每个项目的数据。如果项目没有某些信息,它还会返回一个空数组。由于我使用的是 flatMap,我希望它会删除所有空数组,但完成的数组仍然包含它们。
功能:
Promise.all(
array.flatMap(async (item) => {
const fetchedData = await fetch(`${item.url}`)
.then(response => response.json())
.then(data => data.stats.length ? data : null);
return fetchedData ? { ...fetchedData } : [];
})).then(data => console.log(data));
此外,当我使用 console.log(data.flat()) 而不是 console.log(data) 记录数据时,所有空数组都会被删除,但是它将需要再迭代一次数组。有什么想法为什么 flatMap 不自己做吗?
最佳答案
这是因为你的回调在 flatMap
内是 async
函数,所以无论如何它总是返回一个 Promise。比方说array
有两个项目,第一个项目有 fetchedData
第二个则不会,以下是将会发生的情况的示例:
array
是:[item1, item2]
flatMap
的 map 部分之后你得到[Promise(pending), Promise(pending)]
(请注意,映射是瞬时的,它不会等待异步函数完成,它只是获取从它们返回的 promise )。
在压平部分之后,你会得到 [Promise(pending), Promise(pending)]
(请注意,这与上面的行相同 - promise 无法扁平化。)。
Promise.all.then() 等待每个 Promise 解决并将结果传递为 data
您记录的内容是 [someObject, emptyArray]
.
关于javascript - 为什么 flatMap 不删除空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64372746/