手撸常用数组方法

94 阅读1分钟

数组去重

//for循环 + indexOf
function arrayFilter(arr){
    let res = [];
    for(let i=0; i<arr.length; i++){
        let curr = arr[i];
        if(res.indexOf(curr) === -1){
            res.push(curr);
        }
    }
    return res;
}

// filter + index
function arrayFilter_1(arr){
    return arr.filter((item, index, array) => {
        return array.indexOf(item) === index;
    });
}

// Map
function arrayFilter_3(arr){
    let res = [], map = new Map();
    for(let i=0; i<arr.length; i++){
        let curr = arr[i];
        if(!map.has(curr)){
            res.push(curr);
        }
        map.set(curr, 1);
    }
    return res;
}

// 针对含有NaN的数组去重
function arrayFilter_NaN(arr){
    let res = [];
    for(let i=0; i<arr.length; i++){
        let curr = arr[i];
        if(res.indexOf(curr) === -1){
            if(curr !== curr && isNaN(curr) && res.includes(NaN)) continue;
            res.push(curr);
        }
    }
    return res;
}

扁平化数组

// concat + 递归
function flat(arr){
    let res=[];
    arr.forEach(item => {
        if(Array.isArray(item)){
            res = res.concat(arguments.callee(item)); // 递归调用
        }else{
            res.push(item);
        }
    });
    
    return res;
}

// 用reduce展开一层
function flat_reduce(arr){
    return arr.reduce((init, curr) => {
        return init.concat(Array.isArray(curr) ? flat_reduce(curr) : curr);
    }, [])
}

// 通过传入整数参数控制拍平次数
function flat_by_num(arr, num = Infinity){
    return num > 0
    ? arr.reduce((init, curr) => {
        return init.concat(Array.isArray(curr) ? flat_by_num(curr, --num) : curr)
    });
    : arr.slice();
}

实现Array.prototype.filter

Array.prototype.myFilter = function(fn){
    let res = [];
    this.forEach((item) => {
        if(fn(item)){
            res.push(item)
        }
    });
    return res;
}

实现Array.prototype.map

Array.prototype.myMap = function(fn){
    let res = [];
    this.forEach((item, index, arr) => {
        res[index] = fn(item, index, arr)
    });
    return res;
}

实现Array.prototype.reduce

Array.prototype.myReduce = function(fn, initial=0) {
  let result = initial;
  this.forEach(item => {
    result = fn(result, item);
  })

  return result
}