分类总结Js数组常用的一些方法,从最常用的数组遍历开始。
一 数组遍历
1 Array.forEach()
为每个数组元素调用一个函数,没有返回值,这个要和map()区分开。
var arr = [1, 2, 3];
arr.forEach(function(x, i) { console.log(x); arr[i]++;});
// 输出1 2 3
// 执行后arr为[2, 3, 4],注意这里同时使用了arr和它的索引。
2 Array.map()
与forEach()不同的是,map()会返回一个新数组,长度与array一样。执行机制是对数组的每个元素执行map()中的函数一次,并将此函数的返回值存储在新数组的对应序号处。举例:
var arr = [1, 2, 3];
var newArr = arr.map(function(x) { return x * x;});
// newArr为[1, 4, 9];
二 数组搜索
1 Array.indexOf()
指在arry中查找值,其中可以有第二个参数为开始查找的序号。如果没有查找到返回-1,找到则返回序号值。注意比较的时候使用的为全等即===
。
var arr = [1, 6, 9];
arr.indexOf(1); // 0
arr.indexOf(2); // -1
arr.indexOf(6, 2); // 从第2个元素开始找6,找不到即返回-1
2 Array.lastIndexOf()
与indexOf()同理,只不过查找的方向为反向。
三 数组操作
1 Array.push()
指在数组的尾部追加一个元素,返回值为追加后数组的长度。
var arr = [1, 2, 3];
var len = arr.push(4); // len为4
2 Array.pop()
指在数组尾部移除元素,并返回这个元素。
var arr = [1, 2, 3];
var value = arr.pop(); // value = 3
3 Array.shift()
在数组头部移除一个元素,返回数组原来的第一个元素。
var arr = [1, 2, 3];
var value = arr.shift(); // value = 1
4 Array.unshift()
在数组头部加入一个元素,返回数组的新长度。
var arr = [1, 2, 3];
var value = arr.unshift(0); // arr = [0, 1, 2, 3] value = 4
5 Array.concat()
衔接数组,将参数衔接到原数组中,并且得到一个新数组返回,要注意如果一个参数为一个数组,那么会将数组中的元素衔接到原数组中,而不是数组本身。
var arr = [1, 2, 3];
a.concat(4, 5); // 返回[1, 2, 3, 4, 5]
a.concat([4, 5]); // 返回同上
a.concat([4, 5], [6, 7]); // 返回[1, 2, 3, 4, 5, 6, 7]
a.concat(4, [5, [6, 7]]); // 返回[1, 2, 3, 4, 5, [6, 7]]
6 Array.slice(start, end)
返回数组的一部分,返回值是一个新数组,不会修改原数组。start和end为序号,表示返回从start到end之前的所有元素。如果没有指定end则返回start到尾部所有元素。可使用负值,如-1代表倒数第一个元素,-2代表倒数第二个。
var arr = [1, 2, 3, 4];
arr.slice(0, 3); // 返回[1, 2, 3]
arr.slice(1); // 返回[2, 3, 4]
arr.slice(1, -1); // 返回[2, 3]
arr.slice(-3, -2); // 返回[2]
7 Array.splice(start, deleteCount, value, …)
插入删除或者替换数组元素,start为开始插入或删除处元素的序号,deleteCount为删除元素的个数,从start开始,包含start处的元素,指定为0则表示插入元素而不删除任何元素。value为插入的一个或多个值。
如果在数组中删除了元素则返回一个新数组,包含这些被删除的元素。
var arr = [1, 2, 3,4];
// 从序号为1的位置删除两个元素,并返回这两个元素组成的数组,同时对原数组修改
// 执行后arr为[1,4],返回值为[2,3]
arr.splice(1, 2);
// 再次删除一个元素,返回值为[4],a为[1]
arr.splice(1, 1);
// 从arr中删除0个元素,即不删除,同时加入2和3
// 此时不删除返回值即为[],arr执行后为[1, 2, 3]
arr.splice(1, 0, 2, 3);
8 Array.join(separator)
将数组衔接为字符串,其中可选参数separator为分隔每个元素的字符或字符串。返回值为一个生成的字符串,过程会将每个元素转化为字符串,然后用separator将字符串分隔开,作为最后返回的字符串。
var arr = [1, 2, 3];
var str = arr.join('+'); // 返回"1+2+3"
var str2 = arr.join('a'); // 返回"1a2a3"
四 数组判断(断言)
1 Array.every()
判断断言函数是否对每个元素为真,如果每个元素为真则返回ture,反之为false,类似于做与操作。
var arr = [1, 2, 3];
var result = arr.every(function(x){ return x < 4}); // true,都小于4
var result2 = arr.every(function(x){ return x > 2}); // false,1不大于2
2 Array.some()
判断数组中是否有元素满足断言函数,如果有一个为ture则为ture。
var arr = [1, 2, 3];
var result = arr.some(function(x){ return x < 2}); // true,1小于2
var result2 = arr.some(function(x){ return x > 4}); // false,都不大于4
3 Array.filter()
返回满足断言的数组元素,返回值为一个新数组。
var arr = [1, 2, 3];
var result = arr.filter(function(x){ return x > 1;}); // 返回新数组[2, 3]
五 数组排序
1 Array.sort(orderfunc)
对数组元素进行排序,直接在原数组上进行排序,不会新建数组。
如果执行时不带参数,则按字母顺序(准确来说是字符编码顺序)对数组元素进行排序,如果有必要的话会吧元素转为字符串以便于比较。
如果提供比较函数,按照其他规则来排序的话,函数必须接受参数a和b,并返回一个数字表明相对顺序。
- 如果返回值小于0,则说明a排序小于b,a应当排在b前面
- 等于0则a和b相等,顺序不变
- 大于0则表示a大于b,排在b后面
var arr = [2, 5, 3];
arr.sort(); // arr现在为[2, 3, 5]
var arr2 = [2, 5, 3];
// 反向排序,排序后arr2为[5, 3, 2]
// 举例,如a为5,b为2,则返回值为b-a即小于0,表示在排序中a顺序小于b,即a在b之前
arr2.sort(function(a, b){ return b - a;});
2 Array.reverse()
将数组中的元素顺序颠倒,会在原数组中进行操作。
六 数组计算
1 Array.reduce(f, inital)
从数组元素中计算出一个值,需要给出一个计算函数,计算函数用来对两个值执行操作并返回结果。可选参数为inital,加入后效果和将参数插入数组头部一样。返回值为计算得到的值,举例来说,计算所有数组之和:
function add(a, b) { return a + b; }
var arr = [1, 2, 3];
var result = arr.reduce(add); // 返回值为1+2+3即6
var result2 = arr.reduce(add, 4); // 返回值为1+2+3+4即10
2 Array.reduceRight(f, inital)
同理,和reduce()效果一样,但执行顺序从右到左。
function divide(a, b) { return a / b; }
var arr = [1, 2, 4];
var result = arr.reduce(divide); // 返回值为4/2/1即2