Skip to content

拼多多秋招提前批笔试

  1. 判断以下代码输出结果。

    🔍 展开代码
    1.js
    js
    console.log("v");
    setTimeout(() => {
      console.log("z");
    }, 0);
    async function run() {
      console.log("x");
      await Promise.resolve();
      console.log("y");
    }
    run();
    console.log("w");
  2. 给定一个配置对象,实现路径访问值函数。

    路径规则:① 对象属性访问如 a.b.c;② 数组元素访问如 arr.1arr[1]arr[1];③ 允许混合访问如 a.b[0]

    注意事项:① 不会出现对象属性访问数组和数组索引访问对象的非法输入;② 多个点号是有效的,和单个点号等价。③ 访问不到或者为 undefined 或 null 返回默认值。

    🔍 展开代码
    2.js
    js
    function 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;
    }
  3. 给定了接口和预定词,利用工厂模式实现一个商品搜索函数,并提出以下三个场景需求:

    • 输入第一个字符时直接输出预定词里模糊匹配结果;
    • 连续输入在用户停止操作 500ms 后调用接口;
    • 清空输入立马取消接口调用并直接输出重新输入四个字。
    🔍 展开代码
    3.js
    js
    const 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;
      };
    }
  4. 完成可重试的串行执行异步任务函数,返回执行结果的 Promise 数组。重试过程如果一直失败,抛出最后一次错误。最终返回所有执行结果并抛出最后一个错误。

    🔍 补充信息
    4.js
    js
    function 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;
        });
    }