3a3b4c3...">
美文网首页
前端面试常见算法总结(中)

前端面试常见算法总结(中)

作者: isSunny | 来源:发表于2019-07-14 16:00 被阅读0次

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]

相关文章

网友评论

      本文标题:前端面试常见算法总结(中)

      本文链接:https://www.haomeiwen.com/subject/zxlmkctx.html