JavaScript算法教程之sku(庫(kù)存量單位)詳解
前言
這幾天公司出的題目,之前項(xiàng)目中寫過(guò)一個(gè)類似的,但是寫的很猥瑣(一些表現(xiàn)是通過(guò)頻繁操作DOM實(shí)現(xiàn)的),借著有獎(jiǎng)勵(lì)的機(jī)會(huì)重寫了一下。
sku:
SKU=Stock Keeping Unit(庫(kù)存量單位)。即庫(kù)存進(jìn)出計(jì)量的基本單元,可以是以件,盒,托盤等為單位。SKU這是對(duì)于大型連鎖超市DC(配送中心)物流管理的一個(gè)必要的方法?,F(xiàn)在已經(jīng)被引申為產(chǎn)品統(tǒng)一編號(hào)的簡(jiǎn)稱,每種產(chǎn)品均對(duì)應(yīng)有唯一的SKU號(hào)。單品:對(duì)一種商品而言,當(dāng)其品牌、型號(hào)、配置、等級(jí)、花色、包裝容量、單位、生產(chǎn)日期、保質(zhì)期、用途、價(jià)格、產(chǎn)地等屬性與其他商品存在不同時(shí),可稱為一個(gè)單品。
以上摘自百度百科
思路:
通過(guò)字典鍵值對(duì)(在JavaScript中即是Object數(shù)據(jù)類型)的方式來(lái)查找對(duì)應(yīng)可選屬性。
難點(diǎn):
在于所確定屬性的同級(jí)可選屬性。
實(shí)現(xiàn)步驟:
- 將拿到的數(shù)據(jù)重新組織成需要展示的數(shù)據(jù)格式、計(jì)算使用的字典數(shù)據(jù)格式、以及計(jì)算過(guò)程中需要的一些輔助數(shù)據(jù)。
- 獲取頁(yè)面的所選的屬性。
- 根據(jù)所選屬性組成查找key來(lái)查找結(jié)果。
- 將結(jié)果緩存,方便下次加速查找。
- 表現(xiàn)到頁(yè)面。
- 確定商品。
核心代碼:
/**
* 得到結(jié)果
* @param {string} key 查找關(guān)鍵字以;分割
* @return {array} 所有可選屬性數(shù)組
*/
getResult(key, isRealFind = true) {
// 如緩存中存在,則直接返回結(jié)果
if (this.cacheData[key] && isRealFind) {
this.result = this.cacheData[key];
this.resultID = this.goodsDict[key] ? this.goodsDict[key] : '';
console.log(this.resultID);
return this.result;
}
// 繼續(xù)查找
let result = '';
for (let _key in this.goodsDict) {
let keyArr = key.split(';');
let _keyArr = _key.split(';');
let arr = keyArr.concat(_keyArr);
arr = Array.from(new Set(arr));
if (arr.length === _keyArr.length) {
result += _key;
}
}
if (isRealFind) {
// 所有可選屬性
this.result = result.split(';');
let _keyArr = key.split(';');
if (_keyArr[_keyArr.length - 1] === '') {
_keyArr.pop();
}
for (let i = 0; i < _keyArr.length; i++) {
let _arr = key.split(';');
let str = _arr.splice(i, 1);
let oldResult = this.getResult(_arr.join(';'), false);
let index = '';
// 獲取該key所在索引
this.allKeys.forEach((item, i) => {
if (item.indexOf(str.join('')) !== -1) {
index = i;
return;
}
});
this.allKeys[index].forEach(item => {
if (oldResult.indexOf(item) !== -1) {
this.result.push(item);
}
});
}
this.result = Array.from(new Set(this.result));
// 緩存數(shù)據(jù)
this.cacheData[key] = this.result;
this.resultID = this.goodsDict[key] ? this.goodsDict[key] : '';
console.log(this.resultID);
return this.result;
} else {
return result;
}
}
github地址 (應(yīng)該拉下來(lái)就能跑,頁(yè)面展示用的jQuery,因?yàn)楫?dāng)前項(xiàng)目需要,換成mvvm框架頁(yè)面表現(xiàn)會(huì)更加簡(jiǎn)單)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
微信小程序web-view不支持打開(kāi)非業(yè)務(wù)域名https?//XXXX?請(qǐng)重新配置的解決辦法
小程序現(xiàn)在日漸成熟,功能也越來(lái)越強(qiáng)大,我們今天來(lái)一起看看小程序跳轉(zhuǎn)H5頁(yè)面的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于微信小程序web-view不支持打開(kāi)非業(yè)務(wù)域名https?//XXXX?請(qǐng)重新配置的解決辦法,需要的朋友可以參考下2022-08-08
JS實(shí)現(xiàn)自動(dòng)輪播圖效果(自適應(yīng)屏幕寬度+手機(jī)觸屏滑動(dòng))
這篇文章主要介紹了JS實(shí)現(xiàn)自動(dòng)輪播圖效果(自適應(yīng)屏幕寬度+手機(jī)觸屏滑動(dòng)),需要的朋友可以參考下2017-06-06
G6?TreeGraph樹(shù)圖節(jié)點(diǎn)懶加載使用場(chǎng)景示例
這篇文章主要為大家介紹了G6?TreeGraph樹(shù)圖節(jié)點(diǎn)懶加載使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
JavaScript創(chuàng)建對(duì)象的七種方式(推薦)
JavaScript創(chuàng)建對(duì)象的方式有很多,通過(guò)Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個(gè)對(duì)象,顯然這兩種方式會(huì)產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。接下來(lái)介紹七種非常經(jīng)典的創(chuàng)建對(duì)象的方式,他們也各有優(yōu)缺點(diǎn)2017-06-06
javascript中Date對(duì)象應(yīng)用之簡(jiǎn)易日歷實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了javascript中Date對(duì)象應(yīng)用之簡(jiǎn)易日歷實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07

