今天做的是一个听上去挺简单的需求,就是说用户在进行券码核销的时候扣除积分,如果他有工会积分,就优先扣除公会积分,不够的话呢,就扣除普通积分,要是还不够的话,就扣除充值积分,反正不管怎么样,要扣除10积分,不够就不让核销。说实话,一开始接手的时候,感觉还可以啊,也没有多难。但是当上手的时候,感觉有思路,但是感觉像是被卡住了一样,解决的不算是很优雅。先放代码
let points = [
{ pointType: 1, point: 8 }, //工会积分
{ pointType: 2, point: 4 }, //普通积分
{ pointType: 3, point: 8 } //充值积分
];
let newPoint = [];
let allPoint = 10; // 总的额度
let ghPoint = points.find((v) => {
// 工会
return v.pointType == 1;
});
let chazhiPoint = allPoint - ghPoint.point; // 10-2=8
if (chazhiPoint <= 0) {
newPoint.push({ pointType: 1, point: 10 });
} else {
let ptPoint = points.find((v) => {
// 普通
return v.pointType == 2;
});
let chazhiPoint1 = chazhiPoint - ptPoint.point; // 8 - 6=2
if (chazhiPoint1 <= 0) {
newPoint.push({ pointType: 1, point: ghPoint.point }, { pointType: 2, point: chazhiPoint });
} else {
let czPoint = points.find((v) => {
// 充值
return v.pointType == 3;
});
let chazhiPoint2 = chazhiPoint1 - czPoint.point;
if (chazhiPoint2 <= 0) {
newPoint.push({ pointType: 1, point: ghPoint.point }, { pointType: 2, point: ptPoint.point }, { pointType: 3, point: chazhiPoint1 });
} else {
alert('积分不足');
}
}
}
console.log(newPoint, 'newPoint');
先设置一个point数组来进行模拟,然后,设置一个newPoint来进行接收,再设置一个allPoint变量作为总的额度好进行扣除。
首先利用数组的find()方法吧公会积分的对象也就是pointType == 1 的那一个对象提取出来,然后设置一个变量ghPoint来进行接收。然后用总的额度减去工会积分,用一个新变量chazhiPoint进行接收
let chazhiPoint = allPoint - ghPoint.point;
重头戏来了,首先if判断,如果chazhiPoint <= 0 的话,也就是说公会积分是大于10积分的,那么直接
newPoint.push({ pointType: 1, point: 10 });
这种操作就行了,后面就不用管了,因为他的积分够了。
反之,如果大于0的话,就意味着积分不够,那么再次重复刚刚的操作,把普通积分ptPoint提取出来,然后把之前的chazhiPoint和普通积分相减,这里用一个新变量chazhiPoint1进行接收。
let chazhiPoint1 = chazhiPoint - ptPoint.point;
然后还是那样子,判断这一次的差值,如果chazhiPoint1 <= 0,那么说明它的普通积分是够的,那么就
newPoint.push({ pointType: 1, point: ghPoint.point }, { pointType: 2, point: chazhiPoint });
这个样子啦,这里公会积分就用它本来的积分,因为不够嘛,然后普通积分就用总额减去公会积分的差值,注意,这里不要用chazhiPoint1,还没有到用它的时候。
最后呢,就是else了,就表明即使用了前两个积分还是不够10分的硬性核销标准,那么,我们只能请出充值积分了,然后用chazhiPoint2来接收chazhiPoint1减去充值积分的差值了
let chazhiPoint2 = chazhiPoint1 - czPoint.point;
如果,chazhiPoint2 <= 0,那么还是熟悉的配方,
newPoint.push({ pointType: 1, point: ghPoint.point }, { pointType: 2, point: ptPoint.point }, { pointType: 3, point: chazhiPoint1 });
注意,这里pointType == 2这一项的积分就用它自己本来的积分就行了,谁让他不够呢,千万别用chazhiPoint了,别搞晕了。然后最后一个就用chazhiPoint1就好了。
如果到这里积分还是不够的话,那就没法子了,只能提示积分不够,遗憾离场!
if (chazhiPoint2 <= 0) {
newPoint.push({ pointType: 1, point: ghPoint.point }, { pointType: 2, point: ptPoint.point }, { pointType: 3, point: chazhiPoint1 });
} else {
alert('积分不足');
}
最后看一下最终的成果
依次排列,整整齐齐,正好10分不多,10分不少,换一下参数也是一样的
因为前两个积分都够了,后面就不用他出来了。
ok fine ,感谢看完