杭州 蚂蚁
笔试
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
数组转树结构
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
一面
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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
控制并发请求
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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
问
- 上面的 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