如何使用过滤器而不是forEach(Javascript)
我有下面的功能。我在用forEach。如何在函数中使用filter而不是forEach。我在网上搜索,但找不到实现这一点的方法如何使用过滤器而不是forEach(Javascript),javascript,arrays,function,object,filter,Javascript,Arrays,Function,Object,Filter,我有下面的功能。我在用forEach。如何在函数中使用filter而不是forEach。我在网上搜索,但找不到实现这一点的方法 pendingPaymentsUtils.getPendingPayment = paymentId => { const payments = pendingPaymentsUtils.getPendingPayments() let payment = {} payments.forEach(function(_payment) { if
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
}
filter
返回一个结果数组,因此只需返回该数组并去掉payment
变量即可\u payment.id==paymentId?false:true
可以缩短为justreturn\u payment.id==paymentId代码>
pendingPaymentsUtils.getPendingPayment = paymentId => {
const payments = pendingPaymentsUtils.getPendingPayments();
return payments.find(payment => payment.id === paymentId);
}
如果去掉多余的付款
变量,则时间更短:
pendingPaymentsUtils.getPendingPayment = paymentId =>
pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId);
编辑:
如果未找到对象,则返回空对象,而不是未定义的:
pendingPaymentsUtils.getPendingPayment = paymentId =>
pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId) || {};
filter
返回一个结果数组,因此只需返回该数组并去掉payment
变量即可
\u payment.id==paymentId?false:true
可以缩短为justreturn\u payment.id==paymentId代码>
使用箭头函数的隐式返回可以进一步缩短此时间
从外表上看,你需要的似乎不是
大概是这样的:
pendingPaymentsUtils.getPendingPayment = paymentId => {
const payments = pendingPaymentsUtils.getPendingPayments();
return payments.find(payment => payment.id === paymentId);
}
如果去掉多余的付款
变量,则时间更短:
pendingPaymentsUtils.getPendingPayment = paymentId =>
pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId);
编辑:
如果未找到对象,则返回空对象,而不是未定义的:
pendingPaymentsUtils.getPendingPayment = paymentId =>
pendingPaymentsUtils.getPendingPayments().find(payment => payment.id === paymentId) || {};
您在重构它方面做了哪些努力?forEach
方法有效吗?它似乎只返回与条件匹配的最后一项。您想返回所有符合条件的项目还是只返回最后一个项目?我很确定,如果您只是将文本“forEach”替换为“filter”,它将导致相同的付款返回值。forEach和filter对数组中的每个项目运行一次(在您的情况下为付款)。不同之处在于,filter将返回filter/forEach函数中返回true的每个值的子集数组,而forEach不会返回任何内容。@DanielA.White-谢谢。更新了我的重构代码。@ashwinprabhu您是否只希望在数组中找到一项?您在重构它方面做了哪些努力?forEach的方法有效吗?它似乎只返回与条件匹配的最后一项。您想返回所有符合条件的项目还是只返回最后一个项目?我很确定,如果您只是将文本“forEach”替换为“filter”,它将导致相同的付款返回值。forEach和filter对数组中的每个项目运行一次(在您的情况下为付款)。不同之处在于,filter将返回filter/forEach函数中返回true的每个值的子集数组,而forEach不会返回任何内容。@DanielA.White-谢谢。更新了我的重构代码。@ashwinprabhu您是否只希望在数组中找到一项?mahir-有一个测试用例,当我使用您的解决方案时,它失败了。预期:{“id”:“payment1”}----已接收:[{“id”:“payment1”}]----因此我将作为数组i接收guess@ashwinprabhu正如我所怀疑的,您需要find
而不是filter
find
返回与条件匹配的第一个对象,其中filter
返回与条件匹配的所有项的数组。我已经更新了答案,在前面的实现中使用find
而不是filter
。如果没有找到付款,将返回一个空对象。在新的实现中,将返回undefined。如何纠正这种情况?@ashwinprabhu如果找不到对象,则返回undefined
或null
,这是标准的方法,但是如果您的用例需要一个空对象,那么只需在末尾添加|124;{}
,如果find
返回undefined
(一个虚假值),则返回空对象{}
将被返回。请检查更新的答案。谢谢@ibrahim mahrirmahir-有一个测试案例,当我使用您的解决方案时,它失败了。预期:{“id”:“payment1”}----已接收:[{“id”:“payment1”}]----因此我将作为数组i接收guess@ashwinprabhu正如我所怀疑的,您需要find
而不是filter
find
返回与条件匹配的第一个对象,其中filter
返回与条件匹配的所有项的数组。我已经更新了答案,在前面的实现中使用find
而不是filter
。如果没有找到付款,将返回一个空对象。在新的实现中,将返回undefined。如何纠正这种情况?@ashwinprabhu如果找不到对象,则返回undefined
或null
,这是标准的方法,但是如果您的用例需要一个空对象,那么只需在末尾添加|124;{}
,如果find
返回undefined
(一个虚假值),则返回空对象{}
将被返回。请检查更新的答案。谢谢@ibrahim mahrir