JavaScript 数组方法集合

Array 对象用于在单个的变量中存储多个值。

数组创建

  1. 字面量 - 推荐使用
const arr1 = [];   // 创建一个空数组
const arr2 = [1, 2, 3, 4, 5];  // 创建一个有初始值的数组
  1. 构造函数

当把构造函数作为函数调用不使用 new 运算符时,它的行为与使用 new 运算符调用它时的行为完全一样。new Array() <=> Array()

const arr1 = new Array();   //  创建一个空数组
const arr2 = new Array(3);   // 创建一个length为3,[empty × 3] | [,,,]。
const arr3 = new Array(1, 2, 3, 4, 5);  //  创建一个有初始值的数组 
  1. Array.of() - es6语法

可以弥补数组构造函数Array()的不足,因为参数个数的不同,会导致Array()的行为有差异。

const arr6 = Array.of()  //  []
const arr7 = Array.of(3) //  [3]
const arr8 = Array.of(1, 2, 3, 4, 5)  //  [1, 2, 3, 4, 5]

数组判断

  1. Array.isArray()

用于确定传递的值是否是一个数组, 返回true或false。

Array.isArray([1, 2, 3]);  // true
Array.isArray({}); // false
  • 当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes.
  • 假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

数组合并

  1. concat()

连接两个或多个数组,不会改变原有数组,并返回合并的新数组。
参数可以是具体的值,也可以是数组。可以是任意多个。

const arr = [1, 2];
const arr1 = arr.concat(3, 4, 5);  // [1, 2, 3, 4, 5]
const arr2 = arr.concat([3, 4, 5]);  // [1, 2, 3, 4, 5]
const arr3 = arr.concat([3, 4], [5]); // [1, 2, 3, 4, 5]
  1. 扩展运算符(...)
const arr1 = [1, 2];
const arr2 = [3, 4, 5];
const arr = [...arr1, ...arr2];   //  [1, 2, 3, 4, 5]
  1. 奇技淫巧(复制数组)
const arr = [1, 2, 3, 4, 5];
const arr1 = arr.concat();  // [1, 2, 3, 4, 5] 这个方法不传参数默认浅拷贝arr
const arr2 = [...arr];  //  [1, 2, 3, 4, 5]
const [...arr3] = arr; // [1, 2, 3, 4, 5]
  • 以上方法都是浅拷贝,使用的时候需要注意。

arr3 和 arr4 是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了原数组的成员,会同步反映到新数组。

const arr1 = [{ a: 1 }];
const arr2 = [{ b: 2 }];
const arr3 = arr1.concat(arr2);  
const arr4 = [...arr1, ...arr2];
arr1[0].a = 999;
console.log(arr3[0]);   // 999
console.log(arr4[0]);   // 999

数组增删

  1. push()

向数组的末尾添加一个或多个元素,并返回新的长度。

const arr = [1, 2];
const a = arr.push(3); //  3
const b = arr.push(4, 5); //  5
console.log(arr);  // [1, 2, 3, 4, 5];
  1. unshift()

向数组的开头添加一个或多个元素,并返回新的长度。

const arr = [4, 5];
const a = arr.unshift(3);  // 3
const b = arr.unshift(1, 2); //  5
console.log(arr);  // [1, 2, 3, 4, 5]
  1. pop()

删除数组最后一个元素并返回它。

如果数组为空,则 pop() 不改变数组,并返回 undefined 值。

const arr = [1,2];  
const a = arr.pop();  // 2
const b = arr.pop();  // 1
const c = arr.pop();  // undefined
console.log(arr); //  []
  1. shift()

删除数组第一个元素并返回它。
如果数组为空,那么 shift() 不改变数组,返回 undefined 值。

const arr = [1, 2];
const a = arr.shift();  //  1
const b = arr.shift();  //  2
const c = arr.shift();  //  undefined
console.log(arr);  // []
  1. splice()
array.splice(index, num, item1, ....., itemX)
  • 从数组中添加/删除元素,然后返回被删除的元素,如果没有元素被删除则返回 []。
  • index: 规定添加/删除元素的位置,使用负数可从数组结尾处规定位置。
  • num: 要删除的元素数量,如果设置为 0,则不会删除元素。
  • item1, ..., itemX可选,向数组添加的新项目。
const arr = [1, 2, 3];  
const a = arr.splice(0, 0, 0);  //  [ ]
console.log(arr);  // [0, 1, 2, 3]
const b = arr.splice(0, 4, 7);  //  [0, 1, 2, 3]
console.log(arr);  //  [7]

转为字符串

  1. join()
array.join(separators)。
  • 把数组所有元素拼接成字符串,元素按照指定分隔符进行分隔。
  • separators 可选,指定要使用的分隔符,如果省略该参数则使用逗号作为分隔符。
const arr = [1, 2, 3, 4, 5];
const a = arr.join();  //  "1, 2, 3, 4, 5"
const b = arr.join('-');  //  "1 - 2 - 3 - 4 - 5"
  1. toString()

把数组转换成字符串并返回结果,数组元素之间用逗号分隔,等同于没有参数的 join() 方法。

const arr = [1, 2, 3, 4, 5];
const b = arr.toString();  //  '1, 2, 3, 4, 5'

数组排序

  1. reverse()

颠倒数组中元素的顺序。

const arr = [1, 2, 3];
arr.reverse();
console.log(arr);   //  [3, 2, 1]
  1. sort()

对数组的元素进行排序,默认按升序排序。
如果想按照其他标准进行排序,就需要提供比较函数,比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。若 a 大于 b,则返回一个大于 0 的值。

const a = ['b', 'a', 'e', 'd', 'c'];
a.sort();
console.log(a);  // ['a', 'b', 'c', 'd', 'e'];
---
const b = [3, 2, 1, 5, 4];
b.sort();
console.log(b);  // [1, 2, 3, 4, 5];
---
function sortNumber(a, b)  {
  return a - b
};
const c = ['300', '20', '100', '5', '40'];
c.sort(sortNumber);
console.log(c);  // ['5', '20', '40', '100', '300']

数组截取

  1. slice()

从已有的数组中返回选定的元素。
start: 必需,规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end 可选,规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

const arr = [1, 2, 3, 4, 5];
const a = arr.slice(2);   //  [3, 4, 5];
const b = arr.slice(-2)   // [4, 5];
const c = arr.slice(2, 4)  //  [3, 4];
const c = arr.slice(2, -1) // [3, 4];

数组查找

  1. indexOf()
array.indexOf(searchElement, fromIndex);

返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
要查找的元素fromIndex开始查找的位置。

如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。

如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。
注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.

const arr = [1, 2, 3, 3, 4, 3, 5];
arr.indexOf(3); //  2
arr.indexOf(999);   //  -1
---
arr.indexOf(3, 1);  //  2
arr.indexOf(3, 2);  //  2
arr.indexOf(3, 3);  //  3
arr.indexOf(3, 6);  //  -1
---
arr.indexOf(3, -1); //  -1
arr.indexOf(3, -2); //  5
arr.indexOf(3, -4)  //  3   从倒数第四个元素开始从前往后查找[-, -, -, 3, 4, 3, 5]
  1. lastIndexOf()
array.lastIndexOf(searchElement, fromIndex);

返回元素在数组中的最后一个的索引,如果不存在则返回 -1。
从数组的后面向前查找,从fromIndex处开始,fromIndex默认为数组的长度减1,即整个数组都被查找。
如果该值大于或等于数组的长度,则整个数组会被查找。
如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。
如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。

const arr = [1, 2, 3, 3, 4, 3, 5];  // length 7
arr.lastIndexOf(3); //  5
arr.lastIndexOf(3, 999);   //  5
arr.lastIndexOf(3, 4);  //  3
---
arr.lastIndexOf(3, -1); //  5
arr.lastIndexOf(3, -5); //  2
arr.lastIndexOf(3, -6); //  -1
arr.lastIndexOf(3, -999);   //  -1
  1. find()

用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。

const arr = [1, 2, 3, 4, 5];
const a = arr.find((value, index, arr) => value===3); // 3
const b = arr.find((value, index, arr) => value===7); //  undefined
---
  • 可以接受第二个参数,用来绑定回调函数的this对象。
const arr = [31, 32, 33, 34, 35];
function f(value, index, arr) {
  return value > this.size;
};
const stu = {name: 'Jack', size: 33};
arr.find(f, stu);  //  34
  • 可以发现NaN,弥补了数组的indexOf方法的不足。
const arr = [1, NaN, 2];
const a = arr.indexOf(NaN);  //  -1
const b = arr.find(x => Object.is(NaN,x)); // NaN
  1. findIndex()

返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。

const arr = [1, 2, 3, 4, 5];
const a = arr.findIndex((value, index, arr) => value===5);  //  4
const b = arr.findIndex((value, index, arr) => value===999);  //  -1
  • 可以接受第二个参数,用来绑定回调函数的this对象。
const arr = [31, 32, 33, 34, 35];
function f(value, index, arr) {
  return value > this.size;
};
const stu = {name: 'Jack', size: 33};
arr.findIndex(f, stu);  //  3
  • 可以发现NaN,弥补了数组的indexOf方法的不足。
const arr = [1, NaN, 2];
const a = arr.indexOf(NaN);  //  -1
const b = arr.findIndex(x => Object.is(NaN,x)); // 1
  1. includes()
array.includes(searchElement, fromIndex)

判断一个数组是否包含一个指定的值,根据情况返回 true否false。
该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。

const arr = [1, 2, NaN];
arr.includes(1)  //  true
arr.includes(NaN)   //  true
arr.includes(999)   //  false
---
const arr = [1, 2, NaN];
arr.includes(2, 1);   // true
arr.includes(2, 2);   // false
arr.includes(2, -1);  // false
arr.includes(2, -2);  // true
arr.includes(2, -4)  // true

迭代方法

  1. every()

数组所有元素都满足条件时返回true否则返回false。

const arr = [1, 2, 3, 4, 5];
const a = arr.every((value, index, arr) => value > 0);  //  true
const b = arr.every((value, index, arr) => value > 1);  //  false
  1. some()

数组至少有一个元素满足条件时返回true否则返回false。

const arr = [1, 2, 3, 4, 5];
const a = arr.some((value, index, arr) => value > 4);   //  true
const b = arr.some((value, index, arr) => value > 5);   //  false
  1. filter()

把满足条件的元素组成一个新的数组。

const arr = [1, 2, 3, 4, 5];
const a = arr.filter((value, index, arr) => value > 2);  //  [3, 4, 5]
console.log(arr);  //  [1, 2, 3, 4, 5];
  1. map()

对数组中的每一项运行给定函数,返回每次函数调用的结果组成的新数组。

const arr = [1, 2, 3, 4, 5];
const a = arr.map((value, index, arr) => value*2);  //  [2, 4, 6, 8, 10];
console.log(arr);  //  [1, 2, 3, 4, 5]
  1. forEach()

遍历整个数组,没有返回值。
return false或者true都是结束本次循环执行下一次循环。没有break和continue。

const arr = [1, 2, 3, 4, 5];
const a = [];
arr.forEach((value, index, arr) => a.push(value*2)); 
console.log(a);  //  [2, 4, 6, 8, 10]
console.log(arr);   //  [1, 2, 3, 4, 5]

归并操作

  1. reduce()
array.reduce(callback, initialValue);
callback  //  执行函数
initialValue  //  初始值  
  • 加和操作
const arr = ['1', '2', '3', '4', '5'];
const a = arr.reduce((prev, curr, index, arr) => prev+curr);  //  '12345'
const b = arr.reduce((prev, curr, index, arr) => prev+curr, '0');  //  '012345'
  1. reduceRight()
array.reduce(callback, initialValue);
callback  //  执行函数
initialValue  //  初始值  
  • 加和操作
const arr = ['1', '2', '3', '4', '5'];
const a = arr.reduceRight((prev, curr, index, arr) => prev+curr);  //  '54321'
const b = arr.reduce((prev, curr, index, arr) => prev+curr, '0');  //  '054321'

其余方法

  1. flat()

用于将嵌套的数组“拉平”,变成一维数组。该方法返回一个新数组,对原数据没有影响。

如果想要“拉平”多层,可以给flat()方法传递参数,参数是正整数,默认为1。
如果不知道有多少层,可以用Infinity关键字作为参数。

const arr = [1, [2], [[3]], [[[4]]], 5];
const a = arr.flat();   //  [1, 2, [3], [[4]], 5];
const b = arr.flat(2);  //  [1, 2, 3, [4], 5];
const c = arr.flat(Infinity);  //  [1, 2, 3, 4, 5];
  1. flatMap()

对原数组的每个成员执行一个函数(相当于执行map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
flatMap()方法还可以有第二个参数,用来绑定遍历函数里面的this。

const arr = [1, 2, 3, 4, 5];
arr.flatMap((value ,index, arr) => [[value*2]]);  // [[2], [4], [6], [8], [10]]
  1. fill()

使用给定值,填充一个数组。

还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

const arr = [1, 2, 3, 4, 5];
arr.fill(7);
console.log(arr);  //  [7, 7, 7, 7, 7];
arr.fill(6, 2);
console.log(arr);   // [7, 7, 6, 6, 6];
arr.fill(3, 3, 4);
console.log(arr);   // [7, 7, 6, 3, 6];
arr.fill(1, -5);
console.log(arr);   // [1, 1, 1, 1, 1];
  1. entries(),keys(), values()

用于遍历数组,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

const arr = ['a', 'b', 'c', 'd', 'e'];
for (let index of arr.keys()) {
  console.log(index);
}
//  0 
//  1 
//  2 
//  3 
//  4 
for (let value of arr.values()) {
  console.log(value);
}
// a 
// b 
// c 
// d 
// e
for (let [index, value] of arr.entries()) {
  console.log(index, value);
}
//  0 a  
//  1 b  
//  2 c  
//  3 d  
//  4 e
  1. Array.from()

用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。

//数组去重
const set = new Set([1, 2, 3, 4, 4, 5]);
const arr = Array.from(set);  //  [1, 2, 3, 4, 5]
  1. copyWithin()

数组实例的copyWithin()方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。

Array.prototype.copyWithin(target, start = 0, end = this.length)
  • target(必需):从该位置开始替换数据。如果为负值,表示倒数。
  • start(可选):从该位置开始读取数据,默认为0。如果为负值,表示从末尾开始计算。
  • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
const arr = [1, 2, 3, 4, 5];
arr.copyWithin(0, 2, 3);
console.log(arr);   //  [3, 2, 3, 4, 5]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 转载:在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总...
    七色烟火阅读 3,206评论 0 3
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,072评论 0 3
  • 一、数组定义 array() 1、索引数组 在一个变量中,存储一个或多个值。数组中的每一个元素都有一个访问ID,根...
    竹与豆阅读 525评论 0 0
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,096评论 0 21
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,205评论 0 4