JS数组常用的方法总结

对象继承方法

数组是一种特殊的对象,继承了对象的Object的toString()和valueOf() 方法

toString( )

toString() 方法返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
[注意]该方法的返回值与不使用任何参数调用join()方法返回的字符串相同

[1,2,3].toString();//'1,2,3'
['a','b','c'].toString();//'a,b,c'
[1,[2,'c']].toString();//'1,2,c'

valueOf()

valueOf()方法返回数组对象本身

var a = [1, 2, 3];
console.log(a.valueOf());// [1, 2, 3]
console.log(a.valueOf() instanceof Array);//true

数组转换方法

join()

join()方法可以使用不同的分隔符来构建这个字符串,join()方法只接收一个参数,用作分隔符的字符串,然后返回包含所有数组项的字符串,如果不给join()方法传入任何值,则使用逗号作为分隔符。

var a = [1,2,3];
console.log(a.join());//'1,2,3'
console.log(a.join(' '));//'1 2 3'
console.log(a.join(''));//'123'
var b = new Array(10);
b.join('-');//'---------',9个连字符组成的字符串

栈和队列方法

push

push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。所以,该数组会改变原数组

var a = [];
console.log(a,a.push(1));//[1] 1
console.log(a,a.push('a'));//[1,'a'] 2
console.log(a,a.push(true, {}));//[1,'a',true,{}] 4
console.log(a,a.push([5,6]));//[1,'a',true,{},[5,6]] 5

pop

pop()方法从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。所以,该数组会改变原数组

var a = ['a', 'b', 'c'];
console.log(a,a.pop()); // ['a', 'b'] 'c'

对空数组使用pop()方法,不会报错,而是返回undefined

var a = [];
console.log(a,a.pop()); // [] undefined

shift

shift()方法移除数组中的第一个项并返回该项,同时数组的长度减1。所以,该数组会改变原数组

var a = ['a', 'b', 'c'];
console.log(a,a.shift());//['b', 'c'] 'a'

对空数组使用shift()方法,不会报错,而是返回undefined

var a = [];
console.log(a,a.shift());// [] undefined

unshift

unshift()方法在数组前端添加任意个项并返回新数组长度。所以,该数组会改变原数组

var a = ['a', 'b', 'c'];
console.log(a,a.unshift('x')); //['x', 'a', 'b', 'c'] 4

当使用多个参数调用unshift()时,参数是一次性插入的而非一次一个地插入。这意味着最终的数组中插入的元素的顺序和它们在参数列表中的顺序一致

var a = ['a', 'b', 'c'];
console.log(a,a.unshift('x','y','z')); //['x','y','z','a', 'b', 'c'] 6

数组排序方法

sort()

默认 情况下,sort()方法按字符串升序排列数组项,sort方法会调用每个数组项的toString()方法,然后比较得到的字符串排序,返回经过排序之后的数组,而原数组顺序也发生改变

var array = [1,2,4,3,5];
console.log(array,array.sort());//[1,2,3,4,5] [1,2,3,4,5]
var array = ['3str',3,2,'2'];
console.log(array,array.sort());//[2, "2", 3, "3str"] [2, "2", 3, "3str"]
var array = [1,5,10,50];
console.log(array,array.sort());//[1, 10, 5, 50] [1, 10, 5, 50]

如果数组包含undefined元素,它们会被排到数组尾部

var array = ['3',3,undefined,2,'2'];
console.log(array.sort())  //[2, '2', '3', 3, undefined]

sort( )方法可以接受一个比较函数作为参数,以便指定哪个值在哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个参数之后则返回一个正数。(存在疑问❓)

function compare(value1,value2){
    if(value1 < value2){
        return -1;
    }else if(value1 > value2){
        return 1;
    }else{
        return 0;
    }
}
var array = [100,50,1,10];
console.log(array.sort(compare));//[1, 10, 50, 100]

reverse()

reverse()方法用于反转数组的顺序,返回经过排序之后的数组;而原数组顺序也发生改变

var array = [1,2,4,3,5];
console.log(array,array.reverse());//[5,3,4,2,1] [5,3,4,2,1]
var array = ['str',true,3];
console.log(array,array.reverse());//[3,true,'str'] [3,true,'str']

如果对一个字符串数组执行不区分大小写的字母表排序,比较函数首先将参数转化为小写字符串再开始比较

a = ['ant','Bug','cat','Dog'];
a.sort();//['Bug','Dog','ant','cat'];
a.sort(function(s,t){
    var a = s.toLowerCase();
    var b = t.toLowerCase();
    if(a < b)return -1;
    if(a > b)return 1;
    return 0;
});//['ant','bug','cat','dog']

数组拼接方法

concat()

cancat方法基于当前数组中的所有项创建一个新数组,先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组,所以concat()不影响原数组
如果不给concat()方法传递参数时,它只是复制当前的数组;如果参数是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中;如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾。

var numbers = [1,2];
console.log(numbers,numbers.concat(3,4));//[1,2] [1,2,3,4]
console.log(numbers,numbers.concat([5,4,3],[3,4,5],1,2));//[1,2] [1,2,5,4,3,3,4,5,1,2]
console.log(numbers,numbers.concat(4,[5,[6,7]]));//[1,2] [1,2,4,5,[6,7]]

如果不提供参数,concat()方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是如果数组成员包括复合类型的值(比如对象),则新数组拷贝的是该值的引用

var numbers = [1,{msg:"hahaha",age:11}];
var newNumbers = numbers.concat();
console.log(numbers,newNumbers)
newNumbers[1].msg = "我来啦";  //因为拷贝的引用数据类型的引用,然后新拷贝后的数组中进行改变,也会影响原有的改变。

因为拷贝的引用数据类型的引用,然后新拷贝后的数组中进行改变,也会影响原有的改变。
在这里插入图片描述
concat()方法也可以用于将对象合并为数组,但是必须借助call()方法

var newArray = Array.prototype.concat.call({ a: 1 }, { b: 2 })
console.log(newArray);// [{ a: 1 }, { b: 2 }]
console.log(newArray[0].a);//1

创建子数组方法

slice

slice()方法基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组,所以slice()不影响原数组
 slice(start,end)方法需要两个参数start和end,返回这个数组中从start位置到(但不包含)end位置的一个子数组;

  1. 如果end为undefined或不存在,则返回从start位置到数组结尾的所有项
  2. 如果start是负数,则start = max(length + start,0)
  3. 如果end是负数,则end = max(length + end,0)
  4. start和end无法交换位置
  5. 如果没有参数,则返回原数组
var numbers = [1,2,3,4,5];
console.log(numbers.slice(2));//[3,4,5]
console.log(numbers.slice(2,undefined));//[3,4,5]
console.log(numbers.slice(2,3));//[3]
console.log(numbers.slice(2,1));//[]

console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5]
console.log(numbers.slice(-8));//max(5 + -8,0)=0 -> [1,2,3,4,5]

console.log(numbers.slice(0,-3));//-3+5=2 -> [1,2]
console.log(numbers.slice(-2,-1));//-2+5=3;-1+5=4; -> [4]
console.log(numbers.slice()); //[1,2,3,4,5]

如果不提供参数,slice()方法返回当前数组的一个浅拷贝

var numbers = [1,{msg:"hahaha",age:11}];
var newNumbers = numbers.slice();
console.log(numbers,newNumbers)
newNumbers[1].msg = "我来啦"; 

在这里插入图片描述

数组删改方法

splice

splice()和slice()拥有非常相似的名字,但它们的功能却有本质的区别。
splice()方法用于删除原数组的一部分成员,并可以在被删除的位置添加新的数组成员, 该方法会改变原数组
splice()返回一个由删除元素组成的数组,或者如果没有删除元素就返回一个空数组
1、splice()的第一个参数start指定了插入或删除的起始位置。如果start是负数,则start = max(length + start,0);如果start是NaN,则相当于start = 0。
2、如果只提供一个元素,相当于将原数组在指定位置拆分成两个数组
3、第二个参数number指定了应该从数组中删除的元素的个数。如果省略第二个参数,从起始点开始到数组结尾的所有元素都将被删除。如果number是负数或NaN或undefined,则number=0,因此不删除元素

var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice());// [1,2,3,4,5,6,7,8] []
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(4));// [1,2,3,4] [5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(-4));//-4+8=4; [1,2,3,4] [5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(-9));//max(-9+8,0)=0 [] [1,2,3,4,5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(NaN));//[] [1,2,3,4,5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(0));//[] [1,2,3,4,5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(2,3));// [1,2,6,7,8] [3,4,5]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(2,100));// [1,2] [3,4,5,6,7,8]
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(10,2));// [1,2,3,4,5,6,7,8] []
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(1,-5));//[1,2,3,4,5,6,7,8] []
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(1,NaN));//[1,2,3,4,5,6,7,8] []
var a = [1,2,3,4,5,6,7,8];
console.log(a,a.splice(1,undefined));//[1,2,3,4,5,6,7,8] []

如果后面还有更多的参数,则表示这些就是要被插入数组的新元素

var a = [1,2,3,4,5];
console.log(a,a.splice(2,2,'a','b'));//[1, 2, 'a', 'b', 5]  [3, 4]
console.log(a,a.splice(2,2,[1,2],3));//[1,2,[1,2],3,3,4,5] ['a','b']

数组位置方法

indexOf()

indexOf(search,start)方法接收search和start两个参数,返回search首次出现的位置,如果没有找到则返回-1
search参数表示要搜索的项;使用严格相等运算符(===)进行比较

var arr = [1,2,3,'1','2','3'];
console.log(arr.indexOf('2'));//4
console.log(arr.indexOf(3));//2
console.log(arr.indexOf(0));//-1

start参数表示该搜索的开始位置,该方法会隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数字。若忽略该参数或该参数为undefined或NaN时,start = 0。

var arr = ['a','b','c','d','e','a','b'];
console.log(arr.indexOf('a',undefined));//0
console.log(arr.indexOf('a',NaN));//0
console.log(arr.indexOf('a',1));//5
console.log(arr.indexOf('a',true));//5
console.log(arr.indexOf('a',-1));//max(0,-1+7)=6; -1
console.log(arr.indexOf('a',-5));//max(0,-5+7)=2; 5
console.log(arr.indexOf('a',-50));//max(0,-50+7)=0; 0

数组归并方法

reduce()

let arr = [];
arr.reduce(callback,[])

callback(previousValue, currentValue, index, arr)

其中回调函数接受四个参数:
1、previousValue // reduce()方法提供的初始值(initialValue),或者是上一次调用返回的值
2、currentValue // 数组中的当前元素值
3、index // 当前元素值在数组中的索引
4、arr // 被调用的原数组arr

1、简单求数组内数组的和

[1, 2, 3, 4, 5].reduce(function(prev, cur){
    console.log(prev, cur)
    return prev+ cur;
});
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15

2、利用reduce()方法,可以写一个数组求和的sum方法

Array.prototype.sum = function (){
    return this.reduce(function (prev, cur){
        return prev + cur;
    })
};
[3,4,5,6,10].sum();// 28

3、使用reduce实现二维数组的扁平化

let arr = [[0,1],[2,3],[4,5]]
let newArr = arr.reduce((prev,cur)=>{
	return prev.concat(cur)
},[])
console.log(newArr) //[0, 1, 2, 3, 4, 5]

使用reduce实现多维数组的扁平化

let arr = [0,1,[2,3,4],[5,[6,7,8]]];
function fn(arr){
	return arr.reduce((prev,cur)=>{
		//判断一下进行递归
		return prev.concat(Array.isArray(cur) ? fn(cur) : cur)
	},[])
}
console.log(fn(arr)) //[0, 1, 2, 3, 4, 5, 6, 7, 8]

总结:

可以改变原数组的方法总共有7种:包括unshift()、shift()、push()、pop()这4种栈和队列方法,reverse()和sort()这2种数组排列方法,数组删改方法splice()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值