一、数组去重
常规数组去重一般为双重遍历和使用indexOf方法
1.使用双层for循环去重
const unique = (arr) => {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
};
2.使用indexOf方法去重
const unique = (arr) => {
if (!Array.isArray(arr)) return;
let newArray = [];
for (let i = 0; i < arr.length; i++) {
if (newArray.indexOf(arr[i]) === -1) {
newArray.push(arr[i]);
}
}
return newArray;
};
3.使用Array.from 和 set
const unique = (arr) => {
if (!Array.isArray(arr)) return;
return Array.from(new Set(arr));
};
4.数组转对象
// 利用for in 循环
const obj = {};
const arr = ['a', 'b', 'c'];
for (let key in arr) {
obj[key] = arr[key];
}
console.log(obj); // { 0: 'a', 1: 'b', 2: 'c' }
// 使用扩展运算符
const arr = ['a', 'b', 'c'];
const obj = {...arr};
console.log(obj); // { 0: 'a', 1: 'b', 2: 'c' }
5.性能追踪
// 测试一段js代码的执行耗时,可以使用performance
const start = performance.now();
let sum = 0;
for (let i = 0; i < 1000000; i++) {
sum += 1;
}
const end = performance.now();
console.log(start);
console.log(end);
6.数组扁平化
// for循环 递归方式
const arr = [1, [2, [3, 4]]];
const flatten = arr => {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
};
console.log(flatten(arr)); // [1, 2, 3, 4]
// reduce 方法
const arr = [1, [2, [3, 4]]];
const flatten = arr => {
return arr.reduce((prev, next) => {
return prev.concat(Array.isArray(next) ? flatten(next) : next);
}, []);
};
console.log(flatten(arr)); // [1, 2, 3, 4]
7.获取数组的最后一项
const arr = [1, 2, 3];
// 通过数组length属性
const last = arr[arr.length - 1];
// 通过slice方法
const last2 = arr.slice(-1)[0];
// 通过at方法
const last3 = arr.at(-1);
console.log(last); // 3
8.拷贝数组
const arr = [1, 2, 3];
// slice方法拷贝
const arr2 = arr.slice();
// 展开操作符拷贝
const arr3 = [...arr];
// Array构造函数拷贝
const arr4 = new Array(...arr);
// 数组concat方法
const arr5 = arr.concat();
console.log(arr2); // [1, 2, 3]
9.避免多条件并列
// 多条件判断-不友好
if (status === '1' || status === '2' || status === '3') {}
// 使用switch case语句优化
switch (status){
case '1':
case '2':
case '3':
// todo
break;
}
// 使用includes优化
const enum = ['1', '2', '3'];
if (enum.includes(status) {}