【问题标题】:How filter works in node [duplicate]过滤器如何在节点中工作[重复]
【发布时间】:2023-02-06 17:37:47
【问题描述】:

我在数组中有 6 个对象,所以我需要过滤它们。问题是,在过滤器中,每 6 个对象都会出现错误,在这种情况下,我必须得到空数组,但不会得到空数组。它不过滤,不知道为什么...


    const result = await Promise.all(
      pricesForEachProductTogether.filter(async (finalResult) => {
        const pkgHaveMultiDay: boolean = await filterFinalResultByTravelMultiDay(
          finalResult,
          multiDay
        )

        if (pkgHaveMultiDay) {
          return true
        }

        return false
      })
    )

    return result

这是我的过滤器代码。所以在这种情况下,我在 pkgHaveMultiDay 中得到 6 个错误,所以结果必须是空数组。但是我得到了我的对象......它没有过滤。为什么?

【问题讨论】:

  • filter 应该返回 boolean。如果您返回一个 Promise,它将被视为真实值
  • 您不能直接使用过滤器内部的异步功能。查看this post了解更多信息

标签: javascript node.js typescript


【解决方案1】:

它的工作原理与 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 中描述的完全一样

你的代码的时刻是 filter 不支持异步函数,所以当你输入 async 关键字时 - 你实际上让你的函数返回一个 Promise(用你返回的值解决),它被认为是 true (与任何其他对象一样)

【讨论】:

  • “你的代码的时刻”我从来没有听说过这样使用“时刻”
【解决方案2】:

通过将其作为 async 函数,您将始终返回 Promise,因为这就是异步函数的工作方式,Array.prototype.filter 的本质是同步的。 Promise 始终是truthy,所以即使它是Promise<false>,在将 Promise 本身转换为布尔值时,它也会像true 一样工作。

要解决此问题,请使用 Promise.allawait 所有内部 Promise,创建一个单独的布尔数组来保留,然后使用该布尔数组进行过滤。

const shouldKeepResult = await Promise.all(pricesForEachProductTogether.map(async(finalResult) => {
  const pkgHaveMultiDay = await filterFinalResultByTravelMultiDay(
    finalResult,
    multiDay
  );
  
  return pkgHaveMultiDay;
}));

const result = pricesForEachProductTogether.filter((_, i) => shouldKeepResult[i]);

return result;

【讨论】:

  • 非常感谢,你们成功了。感谢您解释为什么它不起作用。
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多