例题1:数组去重
输入:[1,2,2,,6,,10,9,1,3,]
输出:[1,2,6,10,9,1,3]
条件:去掉空、保持输入顺序
function dedupe(arr){
let setArr = new Set();
let res = [];
for(let k in arr){
//元素不为空、并且没有在setArr出现过
if( arr[k] != null && !setArr.has(arr[k])){
res.push(arr[k]);
setArr.add(arr[k]);
}
}
return res;
}
例2:数组扁平化方案
输入: [[1,2,3],[2,4,5],[6,7,8,9,[10,11,12,[14]]]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,14]
方案一:ES6新特性flat
function flatten(arr){
return arr.flat(Infinity);
}
let arr = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
console.log(flatten(arr));
方案二:toString + splict
function flatten(arr){
arr = arr.toString().split(',').map(item => parseFloat(item));
return arr;
}
let arr = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
console.log(flatten(arr));
方案三:递归
function flatten(arr){
let res = [];
arr.map(item =>{
//Array.isArray(obj) obj 需要检测的值。如果值是 Array,则为true; 否则为false。
if (Array.isArray(item)){
res = res.concat(flatten(item));
}else{
res.push(item);
}
});
return res;
}
let arr = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
console.log(flatten(arr));
例2:数组乱序
输入:[1,2,3,4,5,6,7,8,9]
输出:乱序的数组
方案一:一般化方法
//一般化方法
function shuffle(array){
let copy = [];
let n= array.length;
let i;
while(n){
i = Math.floor(Math.random()*array.length);
//如果这个元素之前没有被选中过
if( i in array){
copy.push(array[i]);
delete array[i];
n--;
}
}
return copy;
}
let array = [1,2,3,4,5,6,7,8,9]
console.log( shuffle(array));
方案二:洗牌算法
function shuffle(arr) {
let n = array.length;
while(n){
let i = Math.floor(Math.random()*n--);
[arr[i],arr[n]] = [arr[n],arr[i]];
}
return arr;
}
let array = [1,2,'2','sss',4,5,6,7,8,9]
console.log(shuffle(array));
例3:不使用临时变量交换两个变量
方法一:使用ES6语法,使用是解构的性质
let a = 1;
let b =2;
[a,b] =[b,a];
console.log(a,b);
方法二:借助加减法
let a = 1;
let b =2;
a = a - b;//a = -1
b = b + a;//b = 2+(-1) =1
a = b - a;//1-(-1) = 2
console.log(a,b);
方法三:借助异或
let a = 1;
let b =2;
a = a ^ b;// a = 0001 ^ 0010 = 0011
b = a ^ b;// b = 0011 ^ 0010 = 0001;
a = a ^ b;// a = 0011 ^ 0001 = 0010;
console.log(a,b);
例4:统计出现次数最多的字符
function findMaxDuplicateChar(str) {
//str长度为1
if(str.length==1){
return str;
}
let charObj ={};
//遍历字符串str的每个字符,生成键值对存入charObj对象中
for(let i = 0; i <str.length; i++){
if (!charObj[str.charAt(i)]){
charObj[str.charAt(i)] = 1;
}else {
charObj[str.charAt(i)] += 1;
}
}
//遍历键值对、找值最大的键、即相应出现次数最多的字符
let maxChar = '', maxValue = 1;
for(let k in charObj){
if(charObj[k] > maxValue){
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar;
}
let str = "a...aaa??abbbb333dd4444dsssi55iiio!!!===ooooo";
console.log(findMaxDuplicateChar(str));
持续更新……