成都8K筆試題分享,看看你值不值8K?
今天剛收到一個(gè)前端筆試邀請(qǐng)(來(lái)自于中石油董小姐拍照地方的公司)

在這個(gè)環(huán)節(jié),你需要完成以下2個(gè)題目
題目一:匹配算法 match-algo
假設(shè)有兩組數(shù)組
const A = []
const B = []
他們的元素?fù)碛邢嗨频臄?shù)據(jù)結(jié)構(gòu)
A的元素
{
? ?name: "Alan",
? ?credit: 10,
? ?address: "10 Peter St.",
? ?skill: ["climbing", "cooking"]
},
{
? ?name: "Jack",
? ?credit: 21.0,
? ?address: "192 Kinsington Ave.",
? ?skill: ["programing"]
},
...
B的元素
{
? ?name: "Jessica",
? ?credit: 10,
? ?address: "82 Lafei St.",
? ?backpack: ["candy", "eyelash"]
},
{
? ?name: "Muse",
? ?credit: 26.3,
? ?address: "33 Udon Drive",
? ?backpack: ["torch"]
},
...
目標(biāo)
輸入任意的A和B數(shù)組,然后進(jìn)行匹配,匹配的輸出示意:
[
? ?{
? ? ? ?aName: "Alan"
? ? ? ?aCredit: 10,
? ? ? ?aAdress: "10 Peter St.",
? ? ? ?aSkill: ["climbing", "cooking"],
? ? ? ?bName: "Jessica",
? ? ? ?bCredit: 10,
? ? ? ?bAddress: "82 Lafei St.",
? ? ? ?bBackpack: ["candy", "eyelash"]
? ? ? ?creditSum: 20,
? ? ? ?composite: [
? ? ? ? ? ?AElement,
? ? ? ? ? ?BElement
? ? ? ?]
? ?}
? ?...
]
// 其中 AElement,BElement分別來(lái)自數(shù)組A和B的匹配元素。
匹配需要滿足如下規(guī)則:
A數(shù)組的一個(gè)元素與B數(shù)組的一個(gè)元素的credit相等
A數(shù)組的多個(gè)元素的credit之和與B元素的credit相等
B數(shù)組的多個(gè)元素的credit之和與A元素的credit相等
同時(shí),你需要輸出未匹配的A數(shù)組元素和B數(shù)組元素,按照其數(shù)組元素原始的數(shù)據(jù)結(jié)構(gòu)輸出即可。
題目二:發(fā)布訂閱模式和自動(dòng)監(jiān)聽
本題的目標(biāo)分為3個(gè)Section
Section 1
subscribe
函數(shù)允許輸入訂閱事件和callback
,當(dāng)另一個(gè)函數(shù)publish
隨著訂閱事件和一系列參數(shù)輸入被調(diào)用時(shí),應(yīng)該運(yùn)行正確callback
,并產(chǎn)生正確的輸出。subscribe
的訂閱事件應(yīng)該允許string
和Symbol
,同時(shí)為了方便,函數(shù)返回的handler可以直接進(jìn)行發(fā)布調(diào)用并允許傳參。要求之后需要實(shí)現(xiàn)的訂閱函數(shù)自然具有此能力,不再贅述。即
const pubA = subscribe("A", (name) => console.log(`helloworld ${name}`);
pubA("Candidate");
// 打印 helloworld Candidate
并且,你應(yīng)該實(shí)現(xiàn)once
函數(shù),函數(shù)允許的輸入與subscribe
函數(shù)相同,但只會(huì)響應(yīng)一次publish
。
Section 2
實(shí)現(xiàn)debounceSubscribe
,函數(shù)允許輸入訂閱事件、callback
和debounceTimer
,在publish
第一次觸發(fā)后的debounceTimer
毫秒內(nèi),不應(yīng)該再次被publish
觸發(fā),但如果在debounceTimer
毫秒內(nèi)有其它的publish
調(diào)用,在此次調(diào)用的debounceTimer
毫秒后,應(yīng)該正確調(diào)用publish
并產(chǎn)生正確的callback
的輸出。
實(shí)現(xiàn)unsubscribe
函數(shù),允許輸入訂閱事件,對(duì)訂閱進(jìn)行注銷。注銷后,不再響應(yīng)發(fā)布事件,
改造你的publish
函數(shù),使得其如果callback
的返回是一個(gè)Promise
對(duì)象時(shí),確保僅最后resolve的Promise
鏈被調(diào)用。
注意你的內(nèi)存管理。
Section 3
實(shí)現(xiàn)一個(gè)reactive
函數(shù),允許輸入一個(gè)Token或一個(gè)對(duì)象、數(shù)組、數(shù)字、字符串、布爾值,該Token可以是一個(gè)對(duì)象、數(shù)組、數(shù)字、字符串、布爾值的reference,如果輸入的是Token,你不應(yīng)該改變此Token的任何屬性。該函數(shù)應(yīng)該返回一個(gè)handle用于保存輸入?yún)?shù)的響應(yīng)式對(duì)象。
實(shí)現(xiàn)一個(gè)watch
函數(shù),允許輸入一個(gè)Token,該Token必須是一個(gè)響應(yīng)式對(duì)象的reference,函數(shù)同時(shí)也允許輸入一個(gè)callback
,該callback
允許接收兩個(gè)參數(shù)oldVal
和newVal
。
當(dāng)Token對(duì)應(yīng)的值改變時(shí),應(yīng)該運(yùn)行正確的callback
并且其參數(shù)應(yīng)該等于Token對(duì)應(yīng)的舊值和新值。
當(dāng)輸入的Token不是一個(gè)由你的reactive
函數(shù)生成的響應(yīng)式對(duì)象時(shí)請(qǐng)拋出錯(cuò)誤Cannot watch non-reactive object
你的watch
函數(shù)仍需要考慮其callback
返回Promise
的情況,并與Section 2的要求一致。
注意
單元測(cè)試用例和用例的Coverage也是考核因素之一,請(qǐng)合理設(shè)計(jì)測(cè)試用例,請(qǐng)?jiān)趩卧獪y(cè)試完全通過(guò)后再提交你的代碼。你可以使用新建Terminal來(lái)開啟新終端會(huì)話,請(qǐng)使用
yarn test
來(lái)啟動(dòng)你的測(cè)試請(qǐng)?jiān)谔峤磺斑\(yùn)行
yarn coverage
生成測(cè)試用例覆蓋報(bào)告問(wèn)題一中數(shù)組的元素的credit字段可能為小數(shù)
請(qǐng)注釋你的代碼,良好的注釋可以幫助審查者閱讀你的代碼
你可以在
package.json
中添加你需要的依賴