【问题标题】:How can i use filter instead of forEach (Javascript)我如何使用过滤器而不是 forEach (Javascript)
【发布时间】:2026-01-01 21:20:03
【问题描述】:

我有以下功能。我正在使用 forEach。我如何在我的函数中使用过滤器而不是使用 forEach。我在网上搜索但找不到实现这一目标的方法。

pendingPaymentsUtils.getPendingPayment = paymentId => {
  const payments = pendingPaymentsUtils.getPendingPayments()
  let payment = {}

  payments.forEach(function(_payment) {
    if (_payment.id === paymentId) {
      payment = _payment
      return false
    }
  })

  return payment
}

我已经尝试了以下方式,但它没有按预期工作。

pendingPaymentsUtils.getPendingPayment = paymentId => {
  const payments = pendingPaymentsUtils.getPendingPayments()
  let payment = {}

  payments.filter(function(_payment) {
      payment = _payment
      return _payment.id === paymentId ? false: true
  })

  return payment
}

【问题讨论】:

  • 你为重构做了哪些努力?
  • forEach 方法有效吗?看起来它只返回与条件匹配的最后一个项目。您要返回所有符合条件的项目还是只返回最后一个?
  • 我很确定如果您只是将文本“forEach”替换为“filter”,它会产生相同的付款返回值。 forEach 和 filter 为数组中的每个项目运行一次(在您的情况下为付款)。不同之处在于 filter 将返回 filter/forEach 函数中每个返回 true 的值的子集数组,而 forEach 不返回任何内容。
  • @DanielA.White- 谢谢。更新了我的重构代码。
  • @ashwinprabhu 您是否只希望在数组中找到一项?

标签: javascript arrays function object filter


【解决方案1】:
  1. filter 返回一个结果数组,所以只需返回它并去掉 payment 变量。
  2. _payment.id === paymentId ? false: true 可以缩短为 return _payment.id === paymentId;
  3. 使用箭头函数的隐式返回来进一步缩短这个时间。
  4. 从外观上看,您需要的是find 而不是filter

类似这样的:

pendingPaymentsUtils.getPendingPayment = paymentId => {
  const payments = pendingPaymentsUtils.getPendingPayments();
  return payments.find(payment => payment.id === paymentId);
}

如果你去掉多余的payments 变量,那就更短了:

pendingPaymentsUtils.getPendingPayment = paymentId =>
  pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId);

编辑:

如果没有找到对象,则返回一个空对象而不是undefined

pendingPaymentsUtils.getPendingPayment = paymentId =>
  pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId) || {};

【讨论】:

  • mahir- 有一个测试用例,当我使用您的解决方案时它失败了。预期:{“id”:“payment1”}-----收到:[{“id”:“payment1”}]----所以我想我收到的是一个数组
  • @ashwinprabhu 正如我所怀疑的,你需要find 而不是filterfind 返回与条件匹配的第一个对象,其中 filter 返回与条件匹配的所有项目的数组。我已将答案更新为使用 find 而不是 filter
  • 在较早的实现中,如果没有找到付款,则返回一个空对象。在新的实现中 undefined 将被返回。如何纠正这种情况?
  • @ashwinprabhu 如果没有找到对象,则返回undefinednull 是标准方法,但如果您的用例需要一个空对象,那么只需在最后添加|| {},这样如果find 返回undefined(一个虚假值),则将返回空对象{}。请检查更新的答案。