拼多多秋招提前批笔试
判断以下代码输出结果。
🔍 展开代码
jsconsole.log("v"); setTimeout(() => { console.log("z"); }, 0); async function run() { console.log("x"); await Promise.resolve(); console.log("y"); } run(); console.log("w");
给定一个配置对象,实现路径访问值函数。
路径规则:① 对象属性访问如
;② 数组元素访问如 或 或 ;③ 允许混合访问如 。 注意事项:① 不会出现对象属性访问数组和数组索引访问对象的非法输入;② 多个点号是有效的,和单个点号等价。③ 访问不到或者为 undefined 或 null 返回默认值。
🔍 展开代码
jsfunction getValue(data, path, defaultValue = undefined) { // 处理路径:将连续点号替换为单个点号,将数组语法转换为点语法 let _path = path .replace(/\.+/g, ".") // 处理连续点号 .replace(/\[(\d+)\]/g, ".$1") // 处理数组索引 .replace(/^\./, "") // 移除开头的点号(如果有) .replace(/\.$/, ""); // 移除结尾的点号(如果有) let keys = _path.split("."); let result = data; for (let key of keys) { result = result[key]; if (!result) { return defaultValue; } } return result; }
给定了接口和预定词,利用工厂模式实现一个商品搜索函数,并提出以下三个场景需求:
- 输入第一个字符时直接输出预定词里模糊匹配结果;
- 连续输入在用户停止操作 500ms 后调用接口;
- 清空输入立马取消接口调用并直接输出重新输入四个字。
🔍 展开代码
jsconst hotKeys = ["iPhone", "iPad", "华为", "小米"]; async function api() { // ... } function createFactory() { let timer = null; let lastKeyword = ""; return function searchGood(keyword) { if (keyword.length === 1 && lastKeyword.length === 0) { const results = hotKeys .filter((item) => item.includes(keyword)) .join(","); console.log("开始搜索", results); } if (timer) { clearTimeout(timer); timer = null; } if (keyword === "") { console.log("重新输入"); lastKeyword = ""; return; } timer = setTimeout(async () => { await api(); timer = null; }, 500); lastKeyword = keyword; }; }
完成可重试的串行执行异步任务函数,返回执行结果的 Promise 数组。重试过程如果一直失败,抛出最后一次错误。最终返回所有执行结果并抛出最后一个错误。
🔍 补充信息
jsfunction executeTasks(tasks = [], retries = 3) { const results = []; let err = null; const exe = (task, remains) => { return task() .then((res) => { return { status: "fulfilled", value: res, times: retries - remains, }; }) .catch((e) => { if (remains > 0) { return exe(task, remains - 1); } err = e || {}; return { status: "rejected", reason: e, times: retries, }; }); }; return tasks .reduce((promiseChain, currentPromise, index) => { return promiseChain.then(() => { return exe(currentPromise, retries).then((r) => { results.push({ index, ...r, }); return results; }); }); }, Promise.resolve()) .then(() => { if (err) { throw err; } return results; }); }