Array api与手撕

138 阅读2分钟

api

splice

添加/删除项目,返回被删除的项目。 array.splice(a,b,c,d,e...)
从下表为A开始删除B个元素。添加CDE...到A下标元素之前。
1.删除操作不够会删除到最后元素为止 2.操作的元素包括下标为A的元素 3.添加的位置在A下标元素之前

sort

默认转码并升序。可接收一个函数有ab两个参,比较返回值<0a在前。

shift

删除第一个元素并返回删除的元素

pop

删除最后一个并返回删除的元素

push

末尾压入

unshift

末尾添加一个或多个,返回长度

reverse

倒叙数组

fill

abc三个参数,使用a把b到c填充。a必填。

从这里开始的方法不会改变原数组,大多以return返回结果

slice

ab两个参数,下表a到下标b拷贝新数组并返回(浅拷贝)

join

a参数,返回用a隔离元素的数组字符串转化结果,不填默认为逗号

concat

任意个数组参数,把参数连接到数组后面。

indexOf

查找是否存在,返回下标或-1。
与字符串的indexOf不同的是数组使用===,NAN不被匹配。

includes

查找,返回boolean

forEach

遍历,参数a为每个遍历的触发函数,b为函数this对象。
回调函数三个可选参数:currentValue当前值(必须)/index下标/arr数组本身

map

对每个值都进行处理返回新的数组。 参数与forEach相同

find/findindex

参数与forEach相同。函数需要返回boolean。
用于找到返回true的元素或下标。

filter

参数为一个参数为a与a的下标返回boolean的函数。
用于筛选返回一个符合要求的元素数组。

手撕

判断数组

数组扁平化

function fun(arr){
  let res = [];
  arr.forEach((i)=>{
    if (i.constructor === Array){
      res = res.concat(fun(i));
    }else{
      res.push(i);
    }
  })
  return res;
}

数组去重

let fun1 = (arr) => {return Array.from(new Set(arr))}
let fun2 = (arr) =>{
    let res = [];
    arr.forEach((i)=>{
        if (!res.includes(i)) res.push(i)
        // if (res.indexOf(i) === -1) res.push(i)
    })
    return res;
}
let fun3 = (arr) =>{
    let res = [];
    arr.forEach((i)=>{
        if (res.indexOf(i) === -1) res.push(i)
    })
    return res;
}
let fun4 = (arr) =>{
    return arr.filter((i,index)=>{
        return arr.indexOf(i) === index;
    })
}
let fun5 = (arr) =>{
    let map = new Map();
    let res = [];
    arr.forEach((i)=>{
        if (!map.has(i)){
            res.push(i);
            map.set(i,true);
        }
    })
    return res;
}

手撕filter

Array.prototype.myFilter=function (fn,thisArg){
    if (!this) return 'this error';
    if (typeof fn !== 'function') return 'fn is not a function';
    let res = [];
    let arr = Array.from(this);
    arr.forEach((...a)=>{
        if (fn.call(thisArg,...a)) res.push(a[0]);
    })
    return res;
}

forEach

Array.prototype.myForEach = function (fn,thisArg){
    if (!fn) return new Error('error');
    let obj = Object(arr);
    let len = Number(obj.length);
    for (let i = 0;i < len;i++){
        fn.call(thisArg,obj[i],i,obj);
    }
}