js - 笔试题收集

提取 get 请求参数

有这样一个 URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如`{a:'1', b:’2’, c:’’, d:’xxx’, e:undefined}`。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let str = 'http://item.taobao.com/item.html?a=1&b=2&c=&d=xxx&e&a=2'

function test(str) {
let params = {}
const paramsStr = str.replace(/.*\?/, '') // 提取参数字符串

// [ 'a=1', 'b=2', 'c=', 'd=xxx', 'e' ]
paramsStr.split('&').forEach(v => {
d = v.split('=') // [a, 1] [b, 2] [c, ''] [d, xxx] [e]
if (d[0] in params) {
Array.isArray(params[d[0]]) ? params[d[0]].push(d[1]) : (params[d[0]] = [params[d[0]], d[1]])
} else {
params[d[0]] = d[1]
}
})
return params
}

console.log(test(str)) // { a: [ '1', '2' ], b: '2', c: '', d: 'xxx', e: undefined }

数组降维

可以使用 Array.prototype.flat() es6+

1
2
3
4
5
6
let arr = [[1, 2], [3, 4]]

let newArr = arr.flat() // [1, 2, 3, 4] 默认降维一层

// 手写
let newArr2 = Array.prototype.concat.apply([], arr) // [1, 2, 3, 4]

js 计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const arr = [1, 8, 6, 2, 5, 4, 8, 3, 7]

function maxArea(arr) {
let [start, area] = [0, 0]
let end = arr.length - 1
while (start < end) {
const h = Math.min(arr[start], arr[end])
const result = h * (end - start)
area = result > area ? result : area
arr[start] > arr[end] ? end-- : start++
}
return area
}
console.log(maxArea(arr)) // 49

返回 1 到 400 所有自然数中一共出现过多少次“1”,如 1 到 21 一共出现过 13 次“1”

1
2
3
4
5
6
7
let count = 0

for (let num = 1; num <= number; num++) {
;`${num}`.replace(/1/g, () => count++)
}

console.log(count) // 180

正则

给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false

1
2
3
4
5
6
let str = 'adfdsaccsdd'
function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str) // // \1指代第一个括号的匹配项
}

console.log(containsRepeatingLetter(str)) // true

在正则表达式中,利用()进行分组,使用斜杠加数字表示引用,\1 就是引用第一个分组,\2 就是引用第二个分组。将[a-zA-Z]做为一个分组,然后引用,就可以判断是否有连续重复的字母。

字符串转驼峰

例如:border-bottom-color —-> borderBottomColor

1
2
3
4
5
6
7
8
9
10
11
let str = 'border-bottom-color'

function toHump(params) {
let newStr = ''
params.split('-').forEach((d, i) => {
newStr += i === 0 ? d : `${d.charAt(0).toUpperCase()}${d.substring(1)}`
})
return newStr
}

console.log(toHump(str)) // borderBottomColor