成都8K笔试题分享,看看你值不值8K?
今天刚收到一个前端笔试邀请(来自于中石油董小姐拍照地方的公司)

在这个环节,你需要完成以下2个题目
题目一:匹配算法 match-algo
假设有两组数组
const A = []
const B = []
他们的元素拥有相似的数据结构
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"]
},
...
目标
输入任意的A和B数组,然后进行匹配,匹配的输出示意:
[
{
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分别来自数组A和B的匹配元素。
匹配需要满足如下规则:
A数组的一个元素与B数组的一个元素的credit相等
A数组的多个元素的credit之和与B元素的credit相等
B数组的多个元素的credit之和与A元素的credit相等
同时,你需要输出未匹配的A数组元素和B数组元素,按照其数组元素原始的数据结构输出即可。
题目二:发布订阅模式和自动监听
本题的目标分为3个Section
Section 1
subscribe
函数允许输入订阅事件和callback
,当另一个函数publish
随着订阅事件和一系列参数输入被调用时,应该运行正确callback
,并产生正确的输出。subscribe
的订阅事件应该允许string
和Symbol
,同时为了方便,函数返回的handler可以直接进行发布调用并允许传参。要求之后需要实现的订阅函数自然具有此能力,不再赘述。即
const pubA = subscribe("A", (name) => console.log(`helloworld ${name}`);
pubA("Candidate");
// 打印 helloworld Candidate
并且,你应该实现once
函数,函数允许的输入与subscribe
函数相同,但只会响应一次publish
。
Section 2
实现debounceSubscribe
,函数允许输入订阅事件、callback
和debounceTimer
,在publish
第一次触发后的debounceTimer
毫秒内,不应该再次被publish
触发,但如果在debounceTimer
毫秒内有其它的publish
调用,在此次调用的debounceTimer
毫秒后,应该正确调用publish
并产生正确的callback
的输出。
实现unsubscribe
函数,允许输入订阅事件,对订阅进行注销。注销后,不再响应发布事件,
改造你的publish
函数,使得其如果callback
的返回是一个Promise
对象时,确保仅最后resolve的Promise
链被调用。
注意你的内存管理。
Section 3
实现一个reactive
函数,允许输入一个Token或一个对象、数组、数字、字符串、布尔值,该Token可以是一个对象、数组、数字、字符串、布尔值的reference,如果输入的是Token,你不应该改变此Token的任何属性。该函数应该返回一个handle用于保存输入参数的响应式对象。
实现一个watch
函数,允许输入一个Token,该Token必须是一个响应式对象的reference,函数同时也允许输入一个callback
,该callback
允许接收两个参数oldVal
和newVal
。
当Token对应的值改变时,应该运行正确的callback
并且其参数应该等于Token对应的旧值和新值。
当输入的Token不是一个由你的reactive
函数生成的响应式对象时请抛出错误Cannot watch non-reactive object
你的watch
函数仍需要考虑其callback
返回Promise
的情况,并与Section 2的要求一致。
注意
单元测试用例和用例的Coverage也是考核因素之一,请合理设计测试用例,请在单元测试完全通过后再提交你的代码。你可以使用新建Terminal来开启新终端会话,请使用
yarn test
来启动你的测试请在提交前运行
yarn coverage
生成测试用例覆盖报告问题一中数组的元素的credit字段可能为小数
请注释你的代码,良好的注释可以帮助审查者阅读你的代码
你可以在
package.json
中添加你需要的依赖