数组日常工作中无处不在使用,面试中也经常问到,比如:
- js数组方法有哪些?
- js数组方法中哪些会改变原数组?
- 怎么给一个数组去重,你能写出几种?
一、数组方法
- 直接操作数组:push 、unshift 、pop 、shift 、splice 、slice 、join 、reverse
- 循环操作数组: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;
});