JS基础:常用的数组方法

69 阅读3分钟

数组日常工作中无处不在使用,面试中也经常问到,比如:

  1. js数组方法有哪些?
  2. js数组方法中哪些会改变原数组?
  3. 怎么给一个数组去重,你能写出几种?

一、数组方法

  1. 直接操作数组:push 、unshift 、pop 、shift 、splice 、slice 、join 、reverse
  2. 循环操作数组:for 、forEach 、map 、reduce 、filter 、find 、findIndex 、some 、sort

1、会改变原数组:

push / unshift

给数组 末尾 / 头部 添加一个数据,返回数组的长度

pop / shift

从数组 末尾 / 头部 删除一个数据,返回被删除的值

let arr = [1,2,3];
let backValue;

//push
backValue= arr.push(4);
console.log(backValue)//4;
console.log(arr);//[1,2,3,4]

//unshift
backValue= arr.unshift(4);
console.log(backValue)//5;
console.log(arr);//[4,1,2,3,4]
//pop
backValue= arr.pop();
console.log(backValue)//4,返回被删除的值
console.log(arr);//[4,1,2,3]
//shift
backValue= arr.shift();
console.log(backValue)//4,返回被删除的值
console.log(arr);//[1,2,3]

splice(索引,数量,添加的数据(选填))

给数组删除或者添加一个数据,返回一个数组

//splice
let arr = [1,2,3]
let backValue= arr.splice(1,1);
console.log(backValue)//[2];
console.log(arr);//[1,3];

reverse()

反转数组.

let arr = [1,2,3,4,5];
let value = arr.reverse();
console.log(value);//[5,4,3,2,1]
console.log(arr);//[5,4,3,2,1]

2、不改变原数组

join('分隔符')

返回一个以分隔符组成的字符串

//join
let arr = [1,3]
let backValue= arr.join();
console.log(backValue)//'1,3';
console.log(arr);//[1,3];

slice(开始索引,结束索引)

截取数组,包前不包后[2,4)

//slice
let arr = [1,2,3,4,5,6];
let backValue= arr.slice(2,4);
console.log(backValue);//[3,4]
console.log(arr);//[1,2,3,4,5,6]

concat

合并数组

//concat
let arr = [1,2,3,4,5,6];
let newArr = [6,7,8];
let concatArr = arr.concat(newArr);
console.log(concatArr);//[1,2,3,4,5,6,6,7,8]
console.log(arr);//[1,2,3,4,5,6]

3、遍历数组,不返回数据

for

for(let i=0;arr.length<i;i++){
 console.log(i)//0,1,2,3,4,5
}

forEach

arr.forEach((item,index,array)=>{
  console.log(item);//1,2,3,4,5,6
})

4、遍历数组,返回数据

filter

过滤数组,返回一个满足条件的数组

let newArr = arr.filter(item=>{
    return item>0;
})
console.log(newArr )//[1,2,3,4,5,6]

map

遍历数组,生成新数组

let newArr = arr.map(item=>{
    return item*10;
})
console.log(newArr )//[10,20,30,40,50,60]

find

遍历数组,找到第一个满足条件的数据

let newArr = arr.find(item=>{
    return item>0;
})
console.log(newArr )//1

findIndex

遍历数组,有找到第一个满足条件的数据则返回索引,没有返回-1

let idx= arr.findIndex(item=>{
    return item==1;
})
console.log(idx)//0

reduce

遍历数组,无初始值时,累加数据

let value= arr.reduce((prev,cur,index(当前数组所在索引,无初始值时为1),arr)=>{
    return prev+cur;
})
console.log(value)//21

有初始值,数组去重

let arr = [1,1,2,3,3,4]
let newArr= arr.reduce((prev,cur,index,arr)=>{
if(!prev.includes(cur)){
    return prev.concat(cur);
}else{
    return prev;
}
},[])
console.log(newArr);//[1,2,3,4]

sort

升序或者降序数组,改变原数组

let arr = [1,5,3,4,6];
//升序
let value = arr.sort((prev,cur,array)=>{
    return prev - cur;
})
console.log(arr);//[1,3,4,5,6]

//降序
 value = arr.sort((prev,cur,array)=>{
    return cur - prev;
})
console.log(arr);//[6,5,4,3,1]

some

遍历数组,只要有一个满足条件的数据返回true,反之返回false

let arr = [1,2,3,5,8];
let value = arr.some(item=>{
    return item>2;
});
console.log(value);//true

find+some的组合循环方法

let arr = [
    {id:1,name:'测试'},
    {id:2,name:'测试1'}
];
let newArr = [
    {id:1,name:'测试'},
    {id:2,name:'新的测试'}
]

arr.find(item=>{
    return newArr.some(res=>return item.name === res.name);
})

二、数组去重的几种方法

1、基本数据类型 数组

1、空数组 + for循环 + includes(value)

let newArr = [];
let arr = [1,1,2,3,3,4,5]
 for(let i=0; i<arr.length;i++){
    if(!newArr.includes(arr[i])){
        newArr.push(arr[i]);
    }
 }
 arr = newArr;

2.空数组 + forEach + includes(value)

let newArr = [];
let arr = [1,1,2,3,3,4,5]
arr.forEach(item=>{
    if(!newArr.includes(item)){
        newArr.push(item);
    }
})
 arr = newArr;

3.filter过滤

let newArr = [];
let arr = [1,1,2,3,3,4,5]
newArr = arr.filter(item=>{
   return !newArr.includes(item)&&newArr.push(item);
})

2、引用数据类型 数组

1、filter + findIndex

let arr = [
    {
        id:1,
        name:'小明'
    },
     {
        id:2,
        name:'小红'
    },
    {
        id:1,
        name:'小明'
    },
]
let newArr = arr.filter((item, index, array) => { 
    return array.findIndex(obj => obj.id === item.id && obj.name === item.name) === index; 
  });