JS数组及数组中常用方法(更新至es15)

282 阅读6分钟

JS数组常用方法

Object.fromEntries()

  • 将有效键值对列表转换为一个对象
const objArr = [['name''xiaomei'], ['age'18]];  
const obj = Object.fromEntries(entries);  
console.log(obj); // { name: 'xiaomei', age: 18 }

at

  • 获取数组的某一元素
const arr = [1,2,3]
console.log(arr.at(1)) // 2

toSorted

  • 返回一个新数组,其元素按升序排列
const arr = [9, 8, 5, 1]
console.log(arr.toSorted()) // [1, 5, 8, 9]

toReversed

  • 返回一个元素顺序相反的新数组。
const arr = [1, 5, 8, 9]
console.log(arr.toReversed()) // [9, 8, 5, 1]

toSpliced

  • splice的复制版,返回一个新数组,并在给定的索引处删除和/或替换了一些元素。
const arr = [1, 5, 8, 9]
console.log(arr.toSpliced(1, 2, 'x')) // [1, 'x', 9]

with

  • 不改变原数组更改数组中某个元素。
const arr = [1, 5, 8, 9]
console.log(arr.with(2, 5)) // [1, 5, 5, 9]

push:

  • 作用:向数组的末尾追加元素
  • 参数(@params):追加的项,多个任意类型
  • 返回值(@return):新数组的长度
  • 是否改变原数组:改变
var ary=[1,2,3];
var res=ary.push(4,'aa',{name:'name'});
console.log(ary,res);   //[1,2,3,4,"aa",{name:"name"}] 6

unshift:

  • 作用:向数组的开头追加内容
  • @params:追加的项,多个任意类型
  • @return:新数组的长度
  • 是否改变原数组:改变
var ary=[1,2,3];
var res = ary.unshift(4);
console.log(ary,res);  //[4,1,2,3] 4

shift:

  • 作用:删除数组第一项
  • @params:无
  • @return:删除的项
  • 是否改变原数组:改变
var ary=[1,2,3];
ary.shift();  //1
console.log(ary);  //[2,3]

pop:

  • 作用:删除数组的最后一项
  • @params:无
  • @return:删除的项
  • 是否改变原数组:改变
var ary=[1,2,3];
ary.pop();
console.log(ary);  //[1,2]

splice(n,m,x):

  • 作用:选中从索引n开始(包含n),删除m项,用x的内容进行替换(基于splice实现删除性能不好,当前项被删后,后面每一项的索引都要向前提一位,如果后面内容过多,影响性能)
  • @params:

n,m都是数字从索引n开始删除m个元素(m不写,是删除到末尾);
n,m,x 从索引n开始删除m个元素,用x占用删除的部分;
n,0,x 从索引n开始,一个都不删,把x放到索引n的前面

  • @return:把删除的部分用新数组存储起来返回
  • 是否改变原数组:改变

删除

var ary=[1,2,3,4,5];
ary.splice(0,1);
console.log(ary); //[2,3,4,5];

新增

var ary=[1,2,4,3];
//基于这种方法可以清空一个数组,把原始数组中的内容以新数组存储起来(有点类似数组克隆)
var res=ary.splice(0);//数组清空
console.log(ary,res);//[] [1, 2, 3]
ary.splice(n,0,x);在索引n的前面添加了x项
ary.splice(0,0,99);  
console.log(ary);  // [99,1,2,4,3]
//向数组末尾追加
ary.splice(ary.length,0,'AA');

slice(n,m):实现数组查询

  • 作用:选中从索引n开始(包含n)到m项(不包含m),slice(0)或者slice() 相当于复制了原数组(浅克隆) 如果n和m为负值,倒着索引之后,正着取值
  • @params:n,m
  • @return:把找到的内容以一个新数组形式返回
  • 是否改变原数组:不改变
var ary=[1,2,3,4];
var res=ary.slice(1,3);
console.log(res);//[2,3]

concat:

  • concat
  • 作用:拼接数组
  • @params:多个任意类型值
  • @return:拼接后的新数组
  • 改变原数组:不改变
var ary1=[1,2,3,4];
var ary2=[4,5,6,7];
var ary3=ary1.concat(ary2);
console.log(c);  //[1, 2, 3, 4, 4, 5, 6, 7]

toString:

  • 作用:把数组转换为字符串
  • @params:无
  • @return:转换后的字符串
  • 是否改变原数组:不改变
var ary=[2,34,56];
var res=ary.toString(); //"2,34,56"

join:

  • 作用:把数组转换为字符串,按照指定的分隔符把数组中的每一项连接起来变成字符串
  • @params:连接符
  • @return:拼接后的字符串
  • 是否改变原数组:不变
var ary=[1,2,3,4];
var res=ary.join("-");  //“1-2-3-4”

Tips:eval()可以把运算符拼接的字符串变为JS表达式执行

indexOf/lastIndexOf:

  • 作用:检测当前项在数组中第一次或最后一次出现的位置 获取某项在数组中首次出现/最后出现的索引(也可以用来查看是否包含某项)
  • @params:(n,m) n:检测的项 m:如果是indexOf的话,就是从索引m开始检索,是lastIndexOf的话,就是从索引m停止检索
  • @return:对应的索引,如果此项中没有,返回值就是-1
  • 是否改变原数组:不改变
var ary=[1,1,1,3,3,3,4,5,6,6]
ary.indexOf(1);//0
ary.lastIndexOf(9);//-1

includes:

  • 作用:看是否包含某项
  • @params:某项
  • @return:布尔
  • 改变原数组;不改变
var ary=[1,2,4];
ary.includes(100);  //false
[1,2,3,4].includes(1); //true
ary.includes(4);//存在返回true,不存在false

reverse:

  • 作用:把数组中元素的倒序排列
  • @params:无
  • @return:倒序的数组
  • 是否改变原数组:改变
var arr = [9,3,6,77];
console.log(arr.reverse());//[77, 6, 3, 9]

sort:

  • 作用:排序
  • @params:无/函数
  • @return:排好序的数组
  • 是否改变原数组:改变
var ary=[4,5,1,2,9]
ary.sort();  //[1,2, 4, 5, 9],不写参数,只能排10以内的
console.log(ary);  //[1,2, 4, 5, 9]
//想要实现多位数正常排序,需要给sort传递一个函数,函数中返回a-b实现升序,返回b-a实现降序
升序:(含有10以上的)
var ary=[11,34,55,2,6];
ary.sort(function(a,b){
    return a-b;
 });
ary.sort((a,b)=>a-b);//改写箭头函数
//降序:
var ary=[11,34,55,2,6];
ary.sort(function(a,b){
    return b-a;
});
ary.sort((a,b)=>b-a);//改写箭头函数

filter

  • 作用:方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
  • @params:
    • currentValue:必须,当前元素的值
    • index:可选,当前元素索引
    • arr:可选,当前元素属于的数组对像
  • #return:返回新数组

filter():不会对空数组进行检测,不会改变原始数组,把回调函数return值复制一份放到新数组中

let arr=[1,2,3,4];
let res=arr.filter((item)=>{
    return item>2;
})
console.log(res);//[3,4]
//filter重写
Array.prototype.myfilter=function myfilter(callback){
    if(!Array.isArray(this) || !this.length || typeof callback!=='function'){
        return [];
    }else{
        let res=[];
        for(let index=0;index<this.length;index++){
            let item=this[index];
            if(callback(item,index,this)){
                res.push(item);
            }
        }
        return res;
    }
}

reduce

  • 作用:方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
  • @params:
    • total:必须,初始值或者计算结束后的返回值
    • currentValue:必须,当前元素
    • currentIndex:可选,当前元素索引
    • arr:可选,当前元素所属数组对象
  • #return:返回新数组
  • 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值

reduce() 对于空数组是不会执行回调函数的。

let arr=[1,2,3];
let res=arr.reduce(function fn(total, num){
    return total + num;
});
console.log(res); //