const priceType = ['monthly', 'annual'];
var discounts =[
{product: "A", monthlyDiscount : 15.0, monthlyMaxDiscount: 30.0, annualDiscount : 25.0, annualMaxDiscount : 20.0},
{product: "B", monthlyDiscount : 5.0, monthlyMaxDiscount: 20.0, annualDiscount : 40.0, annualMaxDiscount : 30.0}
]
var exceedsDiscount;
If any of my discount objects exceeds max discount I need to set the Boolean as true and stop checking other array items.
I used for loops and this works as expected :
exceedsDiscount = false;
angular.forEach(priceType, function(type){
angular.forEach(discounts, function(discount){
if(discount[`${type}Discount`] > discount[`${type}MaxDiscount`]){
exceedsDiscount = true;
return;
}
});
If I try to use the every and some arrow functions the outcome is not same. It randomly gives true or false. Any idea how I can do using without using two for loops?
exceedsDiscount = false;
exceedsDiscount = priceType.every(type => discounts.some(discount =>{return discount[`${type}Discount`] > discount[`${type}MaxDiscount`];}));
CodePudding user response:
As noted by trincot in the comment, instead of .every(.... .some(...))
, if one uses .some(... .some(...))
- the required result is obtained.
By 'some .. some'
we refer to a scenario that there is "some" type for which there is "some" discount which is greater than maxDiscount.
Snippet below:
const priceType = ['monthly', 'annual'];
var discounts = [{
product: "A",
monthlyDiscount: 15.0,
monthlyMaxDiscount: 30.0,
annualDiscount: 25.0,
annualMaxDiscount: 20.0
},
{
product: "B",
monthlyDiscount: 5.0,
monthlyMaxDiscount: 20.0,
annualDiscount: 40.0,
annualMaxDiscount: 30.0
}
];
const everySome = priceType.every(type => discounts.some(discount =>{return discount[`${type}Discount`] > discount[`${type}MaxDiscount`];}));;
const someSome = priceType.some(type => discounts.some(discount =>{return discount[`${type}Discount`] > discount[`${type}MaxDiscount`];}));
console.log(
'\n.every(.. .some( returns: ', JSON.stringify(everySome),
'\n.some(.. .some( returns: ', JSON.stringify(someSome)
);