摘要:原來(lái)的需求是這樣的,用戶生成了元訂單,需要元的發(fā)票去抵消,發(fā)票數(shù)和訂單數(shù)不受限制,將問(wèn)題擬物化,訂單可以想象成杯子,發(fā)票可以想象成水,現(xiàn)在要把水分配到每個(gè)杯子中去我們先記錄每個(gè)杯子的起始值和結(jié)束值,還有當(dāng)前值,起始值當(dāng)前杯子的起始值加上上一
原來(lái)的需求是這樣的,用戶生成了400元訂單,需要400元的發(fā)票去抵消,發(fā)票數(shù)和訂單數(shù)不受限制,
將問(wèn)題擬物化,訂單可以想象成杯子,發(fā)票可以想象成水,現(xiàn)在要把水分配到每個(gè)杯子中去
我們先記錄每個(gè)杯子的起始值和結(jié)束值,還有當(dāng)前值,起始值(start)=當(dāng)前杯子的起始值加上上一個(gè)杯子的結(jié)束值,結(jié)束值(end)即起始值加上杯子的容量,當(dāng)前值(index)即當(dāng)前杯子中的水,如果大于杯子的容量則倒下一個(gè)杯子,依次循環(huán),所以其實(shí)整個(gè)倒水可以看做一個(gè)大杯子,按階段倒水,每次記錄倒水的index(即當(dāng)前(或者當(dāng)次)杯子中的水即可)
現(xiàn)在假設(shè)a杯50L, b杯20L
假如第一次倒, a[0, 50]杯子倒?jié)M,剩余20;index = 50 , start = 0 , end = 50;
第二次倒b杯[50, 70], 首先拿上一下剩余的20L, 剛好倒?jié)M,index = 20; start = 50 ,end = 70
依次類推
話不多說(shuō),上代碼
export function getItemDistribution(a, b, waterKey, cupKey, policyId) { class ItemDistribution { cupList = []; result = []; constructor(list, maps) { this.waterKey = waterKey; this.cupKey = cupKey; this.policyId = policyId; this.sort(list, maps); this.init(list); } sort(list, maps) { let {waterKey, cupKey} = this; if (waterKey) { list = list.sort((a, b) => a[waterKey] - b[waterKey]); } else { list = list.sort((a, b) => a - b); } if (cupKey) { maps = maps.sort((a, b) => a[cupKey] - b[cupKey]); } else { maps = maps.sort((a, b) => a - b); } this.list = list; this.maps = maps; return {list, maps} } init(list) { if (list == null || list.length <= 0) { return; } let start = 0, end = 0, index = 0; let {waterKey} = this; list.forEach((item, id) => { if (!waterKey) { this.result[id] = []; } let water = waterKey ? item[waterKey] : item; end = start + Number(water); this.entry({start, index, end}); start = end; }); this.dispatchMaps(); } entry({start, index, end}) { index = start; this.cupList.push({start, end, index}) } dispatchMaps() { function isEmpty(o) { switch (JSON.stringify(o)) { case "null": case undefined: return true; case "[]": return true; } return false; } let {maps = [], cupList, cupKey} = this; if (isEmpty(cupList) || isEmpty(maps)) return false; maps.forEach((item, id) => { let cup = cupKey ? item[cupKey] : item; this.dispatchCup({item: cup, id}); }); } getCup() { function isEqual(a, b) { return String(a.toFixed(2)) !== String(b.toFixed(2)); } let {cupList} = this; for (let i = 0; i < cupList.length; i++) { let item = cupList[i]; if (isEqual(item.end, item.index)) { return {cup: item, cupIndex: i}; } } return {}; } dispatchCup({item, id}) { let {cup, cupIndex} = this.getCup(); if (!cup) return false; let {index, end} = cup; let remain = end - index; let {waterKey, list, policyId, maps} = this; if (remain > item) { cup.index = cup.index + item; waterKey ? this.result.push({ ...list[cupIndex], [waterKey]: item, [policyId]: maps[id][policyId] }) : this.result[id].push(item); return false; } else { cup.index = cup.end; waterKey ? this.result.push({ ...list[cupIndex], [waterKey]: remain, [policyId]: maps[id][policyId] }) : this.result[id].push(remain); item -= remain; this.dispatchCup({item, id}) } } } return new ItemDistribution(a, b); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96027.html
摘要:鑫大佬這篇博文的重點(diǎn)還是在漸變,而我需要?jiǎng)討B(tài)平緩連續(xù)得實(shí)現(xiàn)顏色的分配,比如原本整個(gè)環(huán)是綠色,然后慢慢地被紅色占了,而且整個(gè)過(guò)程要平滑。 最近的小程序項(xiàng)目有個(gè)設(shè)計(jì)圖要求做一個(gè)圓環(huán),兩種顏色分配,分別代表可用金額和凍結(jié)金額。要是就直接這么顯示,感覺(jué)好像挺沒(méi)水平??于是我決定做個(gè)動(dòng)態(tài)! 在mdn把新特性gradients(漸變)、transitions(過(guò)渡)、 animations(動(dòng)畫(huà))...
摘要:鑫大佬這篇博文的重點(diǎn)還是在漸變,而我需要?jiǎng)討B(tài)平緩連續(xù)得實(shí)現(xiàn)顏色的分配,比如原本整個(gè)環(huán)是綠色,然后慢慢地被紅色占了,而且整個(gè)過(guò)程要平滑。 最近的小程序項(xiàng)目有個(gè)設(shè)計(jì)圖要求做一個(gè)圓環(huán),兩種顏色分配,分別代表可用金額和凍結(jié)金額。要是就直接這么顯示,感覺(jué)好像挺沒(méi)水平??于是我決定做個(gè)動(dòng)態(tài)! 在mdn把新特性gradients(漸變)、transitions(過(guò)渡)、 animations(動(dòng)畫(huà))...
摘要:當(dāng)今社會(huì)是一個(gè)信息化的時(shí)代,多企業(yè)苦于找不到一個(gè)合適的短信群發(fā)平臺(tái),選擇一個(gè)合適的短信服務(wù)平臺(tái)不僅可以高效推送,還可以節(jié)約成本。最后看選擇的公司價(jià)錢是否合適,性價(jià)比高不高,如何計(jì)費(fèi)市面上高的七八分,低的三四分分,但太低的可能會(huì)有風(fēng)險(xiǎn)。當(dāng)今社會(huì)是一個(gè)信息化的時(shí)代,多企業(yè)苦于找不到一個(gè)合適的短信群發(fā)平臺(tái),選擇一個(gè)合適的短信服務(wù)平臺(tái)不僅可以高效推送,還可以節(jié)約成本。下面我們就來(lái)了解下如何選擇一個(gè)合...
摘要:業(yè)務(wù)分析要完成搶紅包的功能重點(diǎn)有兩個(gè)多線程并發(fā)修改數(shù)據(jù)紅包現(xiàn)金分配算法類設(shè)計(jì)用戶對(duì)象包含用戶名稱,所搶到的金額,最后的提示文言字段搶紅包的用戶用戶昵稱用戶搶到的金額用戶獲得系統(tǒng)提示文言并發(fā)訪問(wèn)的共享紅包對(duì)象這個(gè)對(duì)象包含了預(yù)分配的所有小紅包并 【業(yè)務(wù)分析 要完成搶紅包的功能重點(diǎn)有兩個(gè): 多線程并發(fā)修改數(shù)據(jù) 紅包現(xiàn)金分配算法 【類設(shè)計(jì) 用戶對(duì)象:包含用戶名稱,所搶到的金額,最后的提示文...
閱讀 1083·2023-04-25 15:42
閱讀 3684·2021-11-02 14:38
閱讀 2951·2021-09-30 09:48
閱讀 1534·2021-09-23 11:22
閱讀 3504·2021-09-06 15:02
閱讀 3252·2021-09-04 16:41
閱讀 677·2021-09-02 15:41
閱讀 2092·2021-08-26 14:13