【问题标题】:Why flatMap doesn't remove empty arrays?为什么 flatMap 不删除空数组?
【发布时间】:2021-01-30 00:10:12
【问题描述】:

我有一个 flatMap 函数,可以为数组中的每个项目获取和返回数据。如果 item 没有某些信息,它也会返回一个空数组。由于我使用的是 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 不自己做?

【问题讨论】:

  • fetchedData ? { ...fetchedData } : [] 这看起来有点奇怪,您返回的对象或数组取决于fetchedData,这是预期的吗?
  • 我想是的,这就是flatMap的语法。与返回数字或空数组并且正在删除该空数组的数字相同。
  • 如果您在已经 flatMaped 的数组上调用 flat(),那么您将进一步展平一个级别,这将解释删除空数组的原因
  • @pilchard 是的,但这就是 flatMap 应该做的,不是吗?
  • 只有一级,根据docs...and then flattening the result by one level. It is identical to a map() followed by a flat() of depth 1, but slightly more efficient than calling those two methods separately.

标签: javascript arrays reactjs function flatmap


【解决方案1】:

这是因为你在flatMap 中的回调是一个async 函数,所以无论如何它总是返回一个Promise。假设array 有两个项目,第一个将获取数据,第二个不会,这是一个示例:

array 是:[item1, item2]

flatMap 的映射部分之后你会得到[Promise(pending), Promise(pending)](请注意,映射是即时的,它不会等待异步函数完成,它只是获取从它们返回的承诺)。

在展平部分之后你会得到[Promise(pending), Promise(pending)](请注意,这与上面的行相同 - 承诺不能展平。

Promise.all.then() 等待每个 Promise 解决并将结果作为您记录的 data 传递,并且是 [someObject, emptyArray]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2017-03-19
    • 1970-01-01
    • 2021-05-20
    • 2016-06-11
    • 2013-10-14
    • 2021-11-28
    • 2013-09-28
    相关资源
    最近更新 更多