3.实现一个简单的字符串压缩算法
例如:var str = "aaabbbccccfff" =>3a3b4c3f
function compression(str){
var str1 = "";
var num = 1;
for(var i=0;i<str.length;i++){
if(str.charAt(i)==str.charAt(i+1)){
num++;
}else{
str1 +=num;
str1 +=str.charAt(i);
num = 1;
}
}
return str1;
}
var s = "aaabbbccccfff";
console.log(compression(s))//3a3b4c3f
4.实现数组扁平化的几种方法
1.reduce:
var arr1 = [1,2,4,[2,3,4,[2,56]]];
function fn(arr){
return arr.reduce(function(pre,cur){
return pre.concat(Array.isArray(cur)?fn(cur):cur)
},[])
}
console.log(fn(arr1));//[1, 2, 4, 2, 3, 4, 2, 56]
2.es6中"..."扩展符
function fn1(arr){
while(arr.some(item=>Array.isArray(item))){//利用arr.some判断当数组中是否有数组
arr =[].concat(...arr)
}
return arr;
}
console.log(fn(arr1));//[1, 2, 4, 2, 3, 4, 2, 56]
这里说一下some和every区别
首先都是迭代的方法,返回的是boolean值
every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true。
some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true。
3.递归
function flatten(arr){
var newArr = [];
for(var i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
newArr = newArr.concat(flatten(arr[i]));
}else{
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(flatten(arr1));//[1, 2, 4, 2, 3, 4, 2, 56]
4.利用apply
function flatten1(arr){
while(arr.some(item=>Array.isArray(item))){
arr = [].concat.apply([],arr);
}
return arr;
}
console.log(flatten1(arr1));//[1, 2, 4, 2, 3, 4, 2, 56]
5.flat()
默认1层,如果不管有多少层都要转成一维数组,可以用Infinity关键字作为参数。
arr1.flat(Infinity)//[1, 2, 4, 2, 3, 4, 2, 56]
网友评论