我想从现有对象中分配一个新值(假设这是一个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.code
和return 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()
(组合吗?(
注意:如果有更好的方法,我愿意接受
以防万一,我已经试着阅读了这个线程,但仍然不太了解如何在我的情况下实现它:
- 使用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
)
}));
(请在此处查看支持的浏览器(。