总结了日常用到的数组操作方法,包括ES5及ES6的法子
Array对象详细介绍
ES6对数组的扩展
数组添加
unshift(val,val,….)开头添加
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度
1 | var arr = [1,2,3,4,5] |
push(Object,…) 末尾追加
push()方法可向数组的末尾添加一个或多个元素,并返回新的长度
…是ES6的语法
1 | var a = [1, 2, 3], |
数组合并
concat(a,b,…)
concat() 方法用于合并两个或多个数组,返回一个新的数组,被合并的数组数据不变
1 | ['hello'].concat(['world']) |
数组符号合并
用数组符号包起来也可以合并
1 | newArr = ["全部", ...a]; |
数组删除
pop() 删除并返回最后一个
pop() 方法用于删除并返回数组的最后一个元素
1 | var arr = [1,2,3,4,5] |
shift() 删除并返回第一个
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
1 | var arr = [1,2,3,4,5] |
清空数组
方式1,splice
1 | var ary = [1,2,3,4]; |
方式2,length赋值为0
1 | var ary = [1,2,3,4]; |
方式3,赋值为[]
1 | var ary = [1,2,3,4]; |
tip
- 设置数组长度
改变数组长度会改变数据,length设置的小,后面的数据丢掉,如果设置的大,追加空数据,为0就是空数组
var arr=[1,2,3,4,5];
arr.length = 2;
//[1,2]
splice()对数组添加/修改(替换)/删除
warning 常用
splice() 这个语法常用
删除指定位置的值
可以删除任意数量的项,只需要指定2个参数:要删除的第一项的位置和要删除项的项数
语法: arr.splice(起点,长度),如 arr.splice(0,2) 会删除数组中的前两项
1 | var arr = [1,2,3,4,5] |
数组添加、替换
语法:arr.splice(起点,长度为0,需要添加的元素)
提供3个参数:插入起始位置、0(要删除的项数)、要插入的项。 如果要插入多个项,可以再传入第四、第五,一直任意多个项。
1 | var arr = [1,2,3,4,5] |
1 | var arr = [1,2,3,4,5] |
遍历数组
tip
遍历的方法比较多,见:对象和数组遍历方法总结
- forEach((v, i, arr)=>{})
- map((v, i, arr)=>{})
- for(i in arr){}
- for(v of arr){}
- $.each(item,function(i,val){ })
查找/筛选数组数据
find、findIndex、includes是ES6里的新方法 - arr.find((v, i, arr)=> { return v > 9; })
- arr.findIndex((v, i, arr)=> { return v > 9; }
- arr.includes(v)
- arr.filter((v,i)=>{ })
- arr.indexOf(v)
- arr.lastindexof(v)
- $.inArray()
find()
find()方法用于找出第一个符合条件的数组成员,他的参数是一个回调函数,所有数组成员一次执行这个回调函数,直到找出第一个返回值为true的成员,然后返回该成员,找不到符合条件的就返回undefined
1 | [1,5,15,20,25].find((value,index,arr) => { |
findIndex()
与find()类似,不过返回的是成员索引值
1 | [5,10,15,20].findIndex((value,index,arr) => { |
includes()
includes()用来判断一个字符串或数组是否包含一个指定的值,与indexOf不同的是可以判断元素里NaN语法:
Arr.includes(searchString , position)
searchString:关键字,position:可选,开始搜索的位置(默认为0),position也可以是负数,如:-2则是倒数第二个开始,找到返回true ,如果没有找到返回false;includes()方法区分大小写
1 | [1, 2, 3].includes(2) |
filter()
过滤不需要的数组元素
语法:array.filter(function(currentValue,index,arr), thisValue)
1 | var testArray=[100,20,50,46,80,95]; |
indexOf()
indexOf() 方法可返回数组中某个指定的元素第一次出现的位置,如果在数组中没找到指定元素则返回 -1。
1 | var arr = ["Banana", "Orange", "Apple", "Mango"]; |
lastIndexOf()
lastIndexOf()同indexOf方法,只不过返回的是最后出现的位置
1 | var arr = ["Banana", "Orange", "Apple", "Mango", "Apple"]; |
$.inArray()
Jquery的$.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回-1; 和indexOf区别是兼容低版本IE语法:
$.inArray(value,array),value是要查找的值,array是被查找的数组。简单的数组数据可以,复杂的像数组对象就不好使了(数组对象只能转成字符串再遍历),还是ES6的好使
1 | var array = ["asp.net", "asp.net mvc", "html5", "css3", "jquery", "JavaScript"]; |
数组去重
去重的法子很多,有空了再一一补上,把一些代码多、效率差的去掉
遍历数组法
它是最简单的数组去重方法(indexOf方法)
实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中;1
2
3
4
5
6
7
8
9
10
11
12
13var arr=[2,8,5,0,5,2,6,7,2];
let unique1 =>(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
if(hash.indexOf(arr[i])==-1){
hash.push(arr[i]);
}
}
return hash;
}
unique1(arr)
// ...数组下标判断法
调用indexOf方法,性能和方法1差不多
实现思路:如果当前数组的第 i 项在当前数组中第一次出现的位置不是 i,那么表示第 i 项是重复的,忽略掉。否则存入结果数组。1
2
3
4
5
6
7
8
9
10function unique2(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
if(arr.indexOf(arr[i])==i){
hash.push(arr[i]);
}
}
return hash;
}
// ...排序后相邻去除法
实现思路:给传入的数组排序,排序后相同的值会相邻,然后遍历排序后数组时,新数组只加入不与前一值重复的值。1
2
3
4
5
6
7
8
9
10
11function unique3(arr){
arr.sort();
var hash=[arr[0]];
for (var i = 1; i < arr.length; i++) {
if(arr[i]!=hash[hash.length-1]){
hash.push(arr[i]);
}
}
return hash;
}
// ...优化遍历数组法(推荐)
实现思路:双层循环,外循环表示从0到arr.length,内循环表示从i+1到arr.length
将没重复的右边值放入新数组。(检测到有重复值时终止当前循环同时进入外层循环的下一轮判断)1
2
3
4
5
6
7
8
9
10
11
12
13function unique4(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
for (var j = i+1; j < arr.length; j++) {
if(arr[i]===arr[j]){
++i;
}
}
hash.push(arr[i]);
}
return hash;
}
// ...ES6实现
基本思路:ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18function unique5(arr){
var x = new Set(arr);
return [...x];
}
// 扩展:如果重复,则去掉该元素
//数组下标去重
function unique22(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
if(arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])){
hash.push(arr[i]);
}
}
return hash;
}
数组排序
- sort(sortby) 方法用于对数组的元素进行排序,并返回数组。sortby为空则默认排序顺序是根据字符串UniCode码。
[4,3,6,5,72,2,121].sort(); //输出结果: [121, 2, 3, 4, 5, 6, 72]
[“weq”,”d”,”qwe”,”a”,”n”,”p”,”y”].sort(); //输出结果: [“a”, “d”, “n”, “p”, “qwe”, “weq”, “y”]
降序:从大到小排序
sort()方法:
1 | function sortNum(a,b){ |
笨一点的法子:
1 | //创建数组元素arr |
升序:从小到大排序
1 | function sortNum(a,b){ |
接着笨
1 | //创建数组元素arr |
对象数组排序
下面是从小到大,要从大到小也一样,b.sortNo - a.sortNo 就反过来了
1 | var arr= [ { 'sortNo': 2},{ 'sortNo': 1},{ 'sortNo': 5},{ 'sortNo': 6},{ 'sortNo': 79},{ 'sortNo': 3},{ 'sortNo': 999},{ 'sortNo': 4},{ 'sortNo': 0}]; |
对象数组多条件排序
如果sortNo相同,则按sortNo2从大到小
1 | var arr= [ |
颠倒数组顺序
1 | var arr = [1,2,3,4,5,6] |
数组转字符串
- 转字符串
1
2
3
4
5var arr = [1,2,3,4,5,6]
console.log(arr.toString() )
console.log( arr.toLocaleString() )
//都是返回:1,2,3,4,5,6
//在数组里,toString()和toLocaleString()并没有发现区别 - 数组分隔成字符串
join(separator)
方法用于把数组中的所有元素放入一个字符串。分割符号可选,默认是逗号1
2
3
4
5
6
7var a = [1,2,3,4,5,6]
a.join('-')
//"1-2-3-4-5-6"
a.join()
//"1,2,3,4,5,6"
复制数组
slice(start,end)
- 从start开始截取到end但是不包括end
- 返回值为截取出来的元素的集合
- 原始的数组不会发生变化
- end为空就是从指定位置到到最后一个
- start、end如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
1
2
3
4
5
6
7var arr = [1,2,3,4,5,6],
shallowCopy = arr.slice();
shallowCopy.push("news");
console.log(arr, shallowCopy );
console.log(arr.slice(2,5) );
//
数组属性&方法表
ES6的不在内,ES6的见文章顶部的链接
Array 对象属性
属性 | 描述 |
---|---|
constructor | 返回对创建此对象的数组函数的引用 |
length | 设置或返回数组中元素的数目 |
prototype | 使您有能力向对象添加属性和方法 |
Array 对象方法
方法 | 描述 |
---|---|
unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
shift() | 删除并返回数组的第一个元素 |
pop() | 删除并返回数组的最后一个元素 |
slice() | 从某个已有的数组返回选定的元素 |
concat() | 连接两个或更多的数组,并返回结果。 |
sort() | 对数组的元素进行排序 |
reverse() | 颠倒数组中元素的顺序。 |
splice() | 删除元素,并向数组添加新元素。 |
toSource() | 返回该对象的源代码,只有Gecko核心的浏览器(Firefox)支持 |
join() | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 |
toString() | 把数组转换为字符串,并返回结果。 |
toLocaleString() | 把数组转换为本地数组,并返回结果。 |
valueOf() | 返回数组对象的原始值 |