通过Map()中的映射设置新值,并使用reducer使用Javascript将Boolean或Object返回到特定的新



我想从现有对象中分配一个新值(假设这是一个flag,如isActive(。这是我正在尝试的对象的一个例子:

let localValue = {
"id": "019eadd3-2e71-4446-a195-69d849d88a43",
"discount": {
"code": "PFMQWERTY",
"id": "019eadd3-2e71-4446-a195-69d849d88a43",
"isActive": false
},
"discountId": "019eadd3-2e71-4446-a195-69d849d88a43",
"discountRules": [
{
"id": "1-1",
"type": "FIXED",
"value": 30000,
"package": {
"id": "1-1-A",
"name": "Package A",
"maxDiscountInApps": 3,
"discountInApps": [
{
"id": "1-1-A-A",
"code": "QWERTY",
"expirationDate": "2034-02-28T00:00:00+0000"
}
]
}
},
{
"id": "1-2",
"type": "FIXED",
"value": 100000,
"package": {
"id": "1-2-A",
"name": "Package B",
"maxDiscountInApps": 3,
"discountInApps": [
{
"id": "1-2-A-A",
"code": "KASH",
"expirationDate": "2032-02-03T00:00:00+0000"
}
]
}
},
{
"id": "1-3",
"type": "FIXED",
"value": 15000,
"package": {
"id": "1-3-A",
"name": "Package C",
"maxDiscountInApps": 3,
"discountInApps": []
}
},
{
"id": "1-4",
"type": "FIXED",
"value": 180000,
"package": {
"id": "1-4-A",
"name": "Package D",
"maxDiscountInApps": 3,
"discountInApps": []
}
},
{
"id": "1-5",
"type": "FIXED",
"value": 15000,
"package": {
"id": "1-5-A",
"name": "",
"maxDiscountInApps": 3,
"discountInApps": []
}
},
{
"id": "1-6",
"type": "FIXED",
"value": 30003,
"package": {
"id": "1-6-A",
"name": "Package E",
"maxDiscountInApps": 3,
"discountInApps": [
{
"id": "1-6-A-A",
"code": "QWERTY",
"expirationDate": "2034-02-28T00:00:00+0000"
},
{
"id": "1-6-A-B",
"code": "KASH",
"expirationDate": "2032-02-03T00:00:00+0000"
},
{
"id": "1-6-A-C",
"code": "ANT",
"expirationDate": "2021-07-30T00:00:00+0000"
}
]
}
},
{
"id": "1-7",
"type": "FIXED",
"value": 5000,
"package": {
"id": "1-7-A",
"name": "Package F",
"maxDiscountInApps": 3,
"discountInApps": []
}
}
],
"expirationDate": "28/02/2034 07:00:00",
"totalPackagesShown": 2
}

我想实现的目标是检查discountRules.package.discountInApps.code === this.localValue.discount.codereturn true中是否有相同的代码,如果失败,则检查return false

我已经可以找到使用map()some()这样设置它的方法:

this.localValue.discountRules = this.localValue.discountRules.map(
rule => ({
...rule,
isActive:
rule.package &&
rule.package.discountInApps &&
rule.package.discountInApps.length !== 0
? rule.package.discountInApps.some(
ruleItems =>
ruleItems.code === this.localValue.discount.code
)
: false
})
);

但就性能而言,在这种情况下,使用map()reducer()组合更好,还是继续使用map()some()更好?因为我在这里读到了Array.protocole.reduce((,当使用reducer时,似乎可以使数组reduce,直到它找到我想要的值(我的理解正确吗?(所以如果它是真的,那么。。。

使用这种map()reducer()更好(如果可能的话(还是使用map()some()的组合更好?(我仍然无法实现map()reducer(),所以有人能告诉我如何使用这个(map()reducer()(组合吗?(

注意:如果有更好的方法,我愿意接受

以防万一,我已经试着阅读了这个线程,但仍然不太了解如何在我的情况下实现它:

  1. 使用javascript从数组中删除对象

如果您喜欢性能,传统的for循环将是最快的。

对于执行时间,我得到这些

Map & Some: 27ms average
Map & Reduce: 32ms average

您可以使用console.time((和console.timeEnd((来检查执行时间。

array Reduce方法将对所提供数组的每个元素运行回调函数,并从回调中返回计算值(该值将存储在元素的索引中(。如果你想在地图上使用reduce,你可以做这样的

localValue.discountRules = localValue.discountRules.map((rule) => ({
...rule,
isActive:
rule.package &&
rule.package.discountInApps &&
rule.package.discountInApps.length !== 0
? rule.package.discountInApps.reduce(
(accumulatedValue, currentValue) =>
accumulatedValue && currentValue.code === localValue.discount.code,
true // this is the default initial value for the accumulatedValue
)
: false,
}));

或者,你可以使用可选的链接(?(像这个

localValue.discountRules = localValue.discountRules.map((rule) => ({
...rule,
isActive:
rule?.package?.discountInApps?.some(
(ruleItems) => ruleItems.code === localValue.discount.code
)
}));

(请在此处查看支持的浏览器(。

相关内容

最新更新