手写题
参考
https://juejin.cn/post/6946022649768181774#heading-10
数组乱序
js
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr.sort(function () {
return Math.random() - 0.5
})
数组去重
js
//(1)
function unique(arr) {
let newArr = [];
for(let i = 0; i < arr.length; i++){
if(newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
let demo = unique(['a', 'c', 'z', 'a', 'x', 'c', 'b'])
console.log(demo);
//(2)
// var unique = arr => [...new Set(arr)]
//(3)
// function unique(arr) {
// var res = arr.filter(function(item, index, array) {
// return array.indexOf(item) === index
// })
// return res
// }
数组扁平化
将[1, [1, 2], [1, [2]]] 变成 [1, 1, 2, 1, 2]。
js
//第一种:直接使用.flat
// console.log([1, [1,2],[1,[2]]].flat(3));
//第二种:递归+数组API
//(1)
function flatten(arr) {
var result = [];
for(var i = 0, len = arr.length; i < len; i++) {
if(Array.isArray(arr[i])) { // Array.isArray 判断是否为数组
result = result.concat(flatten(arr[i])) // concat() 方法用于连接两个或多个数组
} else {
result.push(arr[i])
}
}
return result;
}
console.log(flatten([1, [1, 2], [1, [2]]]));
//加上遍历深度之后的写法
function flatten(arr, depth = 1) {
var result = [];
for(var i = 0, len = arr.length; i < len; i++) {
if(Array.isArray(arr[i])) { // Array.isArray 判断是否为数组
if(depth > 0) { // 深度大于0时继续扁平化
result = result.concat(flatten(arr[i], depth - 1)) // concat() 方法用于连接两个或多个数组
} else { // 深度为0时直接加入结果数组
result.push(arr[i]);
}
} else {
result.push(arr[i])
}
}
return result;
}
console.log(flatten([1, [1, 2], [1, [2]]])); // [1, 1, 2, 1, [2]]
console.log(flatten([1, [1, 2], [1, [2]]], 2)); // [1, 1, 2, 1, 2]
//(2)
// function flatten(arr) {
// return arr.reduce((pre, cur) => {
// return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
// }, []);
// }
// console.log(flatten([1, [1, 2], [1, [2]]]));
Promise
Promise封装AJAX
js
const getJSON = function(url) {
return new Promise((resolve, reject) => {
const xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.open('GET', url, false);
xhr.setRequestHeader('Accept', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
if (xhr.status === 200 || xhr.status === 304) {
resolve(xhr.responseText);
} else {
reject(new Error(xhr.responseText));
}
}
xhr.send();
})
}
Promise.all
Promise.all 的规则是这样的:
- 传入的所有 Promsie 都是 fulfilled,则返回由他们的值组成的,状态为 fulfilled 的新 Promise;
- 只要有一个 Promise 是 rejected,则返回 rejected 状态的新 Promsie,且它的值是第一个 rejected 的 Promise 的值;
- 只要有一个 Promise 是 pending,则返回一个 pending 状态的新 Promise
js
Promise.all = function(promiseArr) {
let index = 0, result = []
return new Promise((resolve, reject) => {
promiseArr.forEach((p, i) => {
Promise.resolve(p).then(val => {
index++
result[i] = val
if (index === promiseArr.length) {
resolve(result)
}
}, err => {
reject(err)
})
})
})
}
驼峰和连字符转化
驼峰转连字符
js
let s = "thisIsTest";
//replace()函数接收两个参数,第一个参数是一个正则表达式或字符串,用于匹配需要替换的内容,第二个参数是一个字符串或一个函数,用于指定替换后的内容
//正则表达式/([A-Z])/g 表示匹配所有大写字母,其中 [A-Z] 表示匹配所有大写字母,() 表示将匹配结果分组。/g 表示全局匹配
//$1表示第一个匹配分组,也就是匹配到的大写字母。在这里,我们将匹配到的大写字母转换为小写,并在前面添加一个连字符
s = s.replace(/([A-Z])/g, "-$1").toLowerCase();
连字符转驼峰
js
function toHump(name) {
return name.replace(/\-(\w)/g, function(all, letter){
console.log(all) //"_T"
console.log(letter) //"T"
return letter.toUpperCase();
});
}
snowy