Skip to content

杭州 蚂蚁 ​

笔试 ​

2023-07-03 15:00

parseUrl ​

编写一个 JavaScript 函数 parseQueryString,它的用途是把一个 url query 字符串解析为一个对象,如果某个值是一个 json,也需要把它解析为一个对象,如:

js
const url =
  '?name=tb&from=alibaba&job=frontend&extraInfo=%7B%22a%22%3A%22b%22%2C%22c%22%3A%22d%22%7D'

// 结果为:
// {
//   name:"tb",
//   from:'alibaba',
//   job:'frontend',
//   extraInfo: {a: 'b', c: 'd'}
// }

function parseQueryString(url) {
  const queryString = url.split('?')[1]
  if (!queryString) {
    return {}
  }

  const params = {}
  const pairs = queryString.split('&')
  pairs.forEach(pair => {
    const [key, value] = pair.split('=')
    const decodedKey = decodeURIComponent(key)
    const decodedValue = decodeURIComponent(value)

    if (decodedValue.startsWith('{') && decodedValue.endsWith('}')) {
      params[decodedKey] = JSON.parse(decodedValue)
    } else {
      params[decodedKey] = decodedValue
    }
  })

  return params
}
const url =
  '?name=tb&from=alibaba&job=frontend&extraInfo=%7B%22a%22%3A%22b%22%2C%22c%22%3A%22d%22%7D'
const params = parseQueryString(url)
console.log(params)

数组转树结构 ​

ts
function transform(items) {
  // 创建一个空对象作为根节点
  const rootNode = {}

  // 创建一个空对象来保存每个节点的引用
  const nodeMap = {}

  // 遍历输入数组,将每个节点添加到nodeMap中
  items.forEach(item => {
    const { id, parentId, ...data } = item
    const node = { id, data }

    // 如果节点没有父节点,则将其作为根节点
    if (parentId === undefined) {
      rootNode[id] = node
    } else {
      // 如果节点有父节点,则将其添加到父节点的children数组中
      const parentNode = nodeMap[parentId]
      if (parentNode) {
        parentNode.children = parentNode.children || []
        parentNode.children.push(node)
      }
    }

    // 将当前节点添加到nodeMap中
    nodeMap[id] = node
  })

  // 返回根节点
  return rootNode
}
const items = [
  { id: 1, name: 'i1' },
  { id: 2, name: 'i2', parentId: 1 },
  { id: 4, name: 'i4', parentId: 3 },
  { id: 3, name: 'i3', parentId: 2 }
]
const result = transform(items)
console.log(result)

一面 ​

2023-07-04 10:00

数组去重 ​

ts
/**
 *  题目1
 *  数组去重
 */

// 输入
const arr = [
  {
    key: 'activity-101',
    alias: '平台活动'
  },
  {
    key: 'activity-103',
    alias: '店铺活动'
  },
  {
    key: 'activity-102',
    alias: '直播活动'
  },
  {
    key: 'activity-102',
    alias: '直播活动'
  },
  {
    key: 'activity--1',
    alias: '去年'
  },
  {
    key: 'activity--1',
    alias: '去年'
  },
  {
    key: 'activity--1',
    alias: '去年'
  }
]

//输出
// [
//   {
//     "key": "activity-101",
//     "alias": "平台活动"
//   },
//   {
//     "key": "activity-103",
//     "alias": "店铺活动"
//   },
//   {
//     "key": "activity-102",
//     "alias": "直播活动"
//   },
//   {
//     "key": "activity--1",
//     "alias": "去年"
//   },
// ]

function unique(arr) {
  const set = new Set()
  const result = []
  for (const item of arr) {
    if (!set.has(item.key)) {
      set.add(item.key)
      result.push(item)
    }
  }
  return result
}

控制并发请求 ​

ts
/**
 * 题目2
    现有8个图片资源的url,已经存储在数组urls中,实现一个图片加载函数 loadImages。

    要求:
    1. 尽可能快速地将所有图片下载完成,
    2. 在任何时刻同时下载的链接数量不超过3个。
 */

const urls = [
  'https://123.img',
  'https://234.img',
  'https://312.img',
  'https://432.img',
  'https://542.img',
  'https://612.img',
  'https://785.img'
]

function service(url) {}

function loadImages(urls) {
  const promises = []
  const limit = 3

  for (const item of urls) {
    if (promises.length > limit) {
      await Promise.race(promises)
    }
    const promise = service(item)
    promises.push(promise)

    promise.finally(() => {
      promises.splice(promises.indexOf(promise), 1)
    })
  }
  await Promise.all(promises)
}

问 ​

  • 上面的 Promise.all()可以去掉吗
  • Promise 的方法
  • race 和 any 的区别
  • http 1.1 和 2 用的是 tcp 吗
  • OSI 七层模型
  • 会话层做了哪些事
  • redux 和 mobx
  • 如何从 0 配置一个项目
  • 组件库 打包 构建

二面 ​

2023-07-04 19:00

  • 实习介绍

  • 如何拆分组件

  • 组件什么时候应该在项目内 什么时候应该抽离出去作为一个npm包

  • 从输入一个url到页面显示

    • 服务端发生了哪些

OceanBase 数据库

商业化 SQL IDE 工具建设 内部人员管理平台 官网 社区 前端构建 运维

OB自由云 售卖 对接 底座 基础设施建设 部署 流水线

OC ​

五险一金 12% 三个月试用期 80%

9:30 - 6:30

Released under the MIT License.