利用常規(guī)算法帶你一步一步解決前端實(shí)際業(yè)務(wù)
Hello,小伙伴們,愛分享的知了小姐姐又來啦!

一提到算法,一些小伙伴們聽著“打腦殼”,一些小伙伴會覺得天天搞什么排序,二叉樹迭代...有啥意思,工作中用不到。哈哈,“老子”說的好,不是用不到,而是你還沒到那個(gè)level。
今天主要是聊聊學(xué)習(xí)簡單的算法在實(shí)際工作中的利用,沒有什么太高深的東西(白嫖怪請走開),只是跟大家分享這個(gè)思考過程,從最low的代碼一步一步思考,最后到基本還看的過去代碼。(文章較長!小妹兒,先上鴛鴦鍋吃起!)
業(yè)務(wù)場景
添加商品這個(gè)常見場景我相信很多小伙伴們都遇到過,大家都知道(SPU)加上一些屬性才組成(SKU),比如最常見的“門”,門是SPU,門包含了顏色、材質(zhì)、開口方向等一堆屬性,直接上代碼!
彩蛋--其實(shí)我是賣門的小二,會有些小伙伴沒有這個(gè)生活經(jīng)驗(yàn),哈哈!正好給大家普及一下,畢竟將來都是要買房子裝修的人,如果小伙伴正好遇到選門這方面的問題留言咨詢哈!

1. 嵌套循環(huán)
這種方式是最容易想到了,就是第一個(gè)屬性數(shù)組迭代,里面再放入第二個(gè)屬性數(shù)組,再放第三個(gè)...

我的天啦!O(N^3)的復(fù)雜度。哈哈,機(jī)智的你是不是早就看出了!難道我的屬性只有3個(gè)?不可能啊,比如你選了鈦合金門,還有70料,83料,85料,90料等等,不同的料價(jià)格不同也就是不同的SKU啊。所以這個(gè)操作肯定是不行的。
2. 兩兩組合
上面的操作當(dāng)額外增加屬性的時(shí)候就不行了,那么我們先解決這個(gè)問題。我們采用屬性兩兩組合,也就是先讓directions和colors組合成二維數(shù)組返回,再和materials組合。上代碼!

結(jié)果如下:
再遍歷一次分開就搞定。這種操作從時(shí)間復(fù)雜度可以看成O(N^2),似乎解決了未知屬性集合數(shù)量的拼裝,但是始終不夠優(yōu)雅。我們繼續(xù)往下思考!
3. 排列組合(遞歸回溯)
本來我打算自己貼代碼,但是前幾天看到一篇博文寫的很好,這里大家可以看一下?@晨曦時(shí)夢見兮?老師的一篇博文,他寫的已經(jīng)非常仔細(xì)了。https://juejin.im/post/6844904191379374087。 如果晨曦的代碼看著暈可以看下面每一行加注釋的代碼。
這里我把思路再整理一下:最終我們需要拼裝成二維數(shù)組[["左鎖內(nèi)開","象牙白","實(shí)木"]、["右邊內(nèi)開","胡桃木","實(shí)木"]...],那么我們的遞歸體就是去完成二維數(shù)組里面的每一項(xiàng)的拼裝。 為了方便大家讀我把每一行代碼加了注釋。大家在看代碼的時(shí)候,不要硬看,要學(xué)會使用debug,同時(shí)也要有良好的js基礎(chǔ),高階函數(shù)、閉包、遞歸等等。

總結(jié)
大家都是從小白慢慢的學(xué)習(xí)到能獨(dú)擋一面的,只有非常厲害的人才能一下想到?遞歸回溯,借用 晨曦老師的話:我們可以先記住一些固定的模式,再從實(shí)際工作中去慢慢領(lǐng)會,同時(shí)夯實(shí)JS基礎(chǔ),多去嘗試,萌新終究會變成別人眼中的大佬!再次感謝?@晨曦時(shí)夢見兮?老師的博文,幫我省了很多篇幅。
ps:文章來源于知了堂蛋糕哥。