首页 > 解决方案 > 我如何使用过滤器而不是 forEach (Javascript)

问题描述

我有以下功能。我正在使用 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
}

标签: javascriptarraysfunctionobjectfilter

解决方案


  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) || {};

推荐阅读