算法

获取页面HTML标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//获得页面所有HTML标签。一是获取,二是去重
var a = document.getElementsByTagName('*');
var arr = [],ar=[];
function m(){
for(var i=1;i<a.length;i++){
ar.push(a[i].tagName);
}
for(var j=0;j<ar.length;j++){
if(arr.includes(ar[j])===false){
arr.push(ar[j]);
}
}
return arr;
}
1
2
3
4
5
//Best方案ES6,利用set特性去重
let tags = [...document.getElementsByTagName('*')].map((v) => {
return v.tagName
})
tags = [...new Set(tags)]

快速排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//快速排序
function quicksort(x){
if(x.length<= 1){//必须<=
return x;
}

let middle = x.splice(Math.floor(x.length/2),1);
let left = [],right = [];

for(let i = 0;i<x.length;i++){
if(x[i]<middle){
left.push(x[i]);
}else{
right.push(x[i])
}
}
return quicksort(left).concat(middle,quicksort(right));
}
var result = quicksort([2,1,4,7,3,8,5,0]);

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//冒泡排序
function bubblesort(x){
for(let i = 0,len = x.length;i<len;i++){
for(let j = i+1;j<len;j++){//区间继续优化
if(x[i]>x[j]){
let temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
return x;
}
var result = bubblesort([2,1,4,7,3,8,5,0]);
console.log(result);

参考:https://blog.csdn.net/szu_aker/article/details/52295488

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function chose(x) {
var len = x.length,
minindex, middle;
for (let i = 0; i < len; i++) {
minindex = i;
for (let j = i + 1; j < len; j++) {
if (x[j] < x[minindex]) {
minindex = j; //不断循环找最小值的索引
}
}
middle = x[i];
x[i] = x[minindex];
x[minindex] = middle;

}
console.log(x);
}
chose([2,4,0,1,2,8,5])

深拷贝

1
2
3
4
5
6
7
8
9
function deepclone(obj){
let newObj = obj.constructor=== Array?[]:{};
for(let i in obj){
newObj[i] = typeof obj[i] === 'object'?deepclone(obj[i]):obj[i];
}
return newObj;
}
var result = deepclone({m:[1,2],n:{k:5}});
console.log(result);

找重复字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = 'aasjhdhdhjjjsssa';
str = str.split('').sort().join(''); //排序
var value = '',
index = 0;
var re = /(\w)\1+/g;
str.replace(re, function($0, $1) {
//$0 是aaa dd ...这几项。$1是a d ..这几项
//执行时是一个个执行的,先是aaa,再是dd这样子
if (index < $0.length) {
index = $0.length; //不断覆盖长度短的,故最终的index就是最长的
value = $1; //最终的value就是最长的那个元素
//一个小bug,最长的有好几个怎么办,加入index===$0.length的判断
}
})
console.log(index + 'is' + value)

数组降维

如[[1,2],[3,4]]到[1,2,3,4].(二维数组降维)

1
2
3
4
5
6
7
8
9
10
//嵌套循环
function reduceDimension(arr){
var reduced = [];
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
reduced.push(arr[i][j]);
}
}
return reduced;
}

1
2
3
4
5
6
7
8
//concat
function reduceDimension(arr){
var reduced = [];
for(var i=0;i<arr.length;i++){
reduced = reduced.concat(arr[i]);
}
return reduced;
}
1
2
3
4
5
//apply concat
//apply参数1为被调用函数的this,参数2为被调用对象的arguments。即数组的各个元素依次成为被调用函数的各个参数。
function reduceDimension(arr){
return Array.prototype.concat.apply([],arr);
}

多维数组递归降维。(后续补充)