JS基础 - 数组操作方法合集

常用的处理数组的方法合集

遍历

forEach

forEach:对数组内的每个方法都执行一次给定的函数

语法:arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

const array1 = ['a', 'b', 'c'];
array1.forEach(element => console.log(element));

可选参数可以获取到:当前的值、index、当前被循环的数组。

一个额外的参数 thisArg,可以用来指定调用回调函数时的 this 的值,举个例子:

const array1 = ['a', 'b', 'c'];
const obj = {a: 1};

array1.forEach(function(){
    console.log(this)
}, obj);

//output: {a: 1}

需要注意的是:如果要正确获取 this 的值,不能用箭头函数。

map、filter 两个方法都支持修改 this 的指向。

map

map:返回一个数组,其中每个元素都使用指定函数进行过转换。

语法:

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
 // Return element for new_array 
}[, thisArg])
const arr = [1, 2, 3, 4, 5, 6];
const mapped = arr.map(el => el + 20);
console.log(mapped);
// [21, 22, 23, 24, 25, 26]

filter

filter:返回一个数组,只有当指定函数返回 true 时,相应的元素才会被包含在这个数组中。

语法:var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

const arr = [1, 2, 3, 4, 5, 6];
const filtered = arr.filter(el => el === 2 || el === 4);
console.log(filtered);
// [2, 4]

查询

every

every:测试一个数组内的所有元素是否都能通过某个指定函数的测试,返回一个布尔值。

语法:var newArray = arr.every(callback(element[, index[, array]])[, thisArg])

const array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every((currentValue) => currentValue < 40));
// output: true

some

some:判断数组中是否至少有一个元素通过了函数测试。

语法:arr.some(callback(element[, index[, array]])[, thisArg])

const array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every((currentValue) => currentValue < 10));
// output: true

find

find:返回数组中满足提供的测试函数的第一个元素的值。

语法:arr.find(callback[, thisArg])

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const found = arr.find(el => el > 5);
console.log(found);
// 6

虽然 5 之后的元素都符合条件,但只返回第一个匹配的元素。

findIndex

findIndex:返回数组中满足提供的测试函数的第一个元素的索引。

语法:arr.findIndex(callback[, thisArg])

const arr = ['Nick', 'Frank', 'Joe', 'Frank'];
const foundIndex = arr.findIndex(el => el === 'Frank');
console.log(foundIndex);
// 1

indexOf

indexOf:返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

语法:arr.indexOf(searchElement[, fromIndex])

fromIndex:开始查找的位置。

const arr = ['Nick', 'Frank', 'Joe', 'Frank'];
const foundIndex = arr.indexOf('Frank');
console.log(foundIndex);
// 1

lastIndexOf

lastIndexOf:返回给定元素在数组内的最后一个索引,如果不存在,则返回 -1。

语法:arr.lastIndexOf(searchElement[, fromIndex])

includes

includes:判断数组中是否包含某项,返回一个布尔值。

语法:arr.includes(valueToFind[, fromIndex])

const array1 = [1, 2, 3];
console.log(array1.includes(2));
// output: true

增删

push、pop、shift、unshift

push:这是一个相对简单的方法,它将一个项添加到数组的末尾。它就地修改数组,函数本身会返回添加到数组中的项。

let arr = [1, 2, 3, 4];
const pushed = arr.push(5);
console.log(arr);
// [1, 2, 3, 4, 5]
console.log(pushed);
// 5

pop:从数组中删除最后一项。同样,它也是就地修改数组。函数本身返回从数组中删除的项。

let arr = [1, 2, 3, 4];
const popped = arr.pop();
console.log(arr);
// [1, 2, 3]
console.log(popped);
// 4

shift:从数组中删除第一个项。同样,它也是就地修改数组。函数本身返回从数组中删除的项。

let arr = [1, 2, 3, 4];
const shifted = arr.shift();
console.log(arr);
// [2, 3, 4]
console.log(shifted);
// 1

unshift:将一个或多个元素添加到数组的开头。同样,它也是就地修改数组。与其他方法不同的是,函数本身返回数组最新的长度。

let arr = [1, 2, 3, 4];
const unshifted = arr.unshift(5, 6, 7);
console.log(arr);
// [5, 6, 7, 1, 2, 3, 4]
console.log(unshifted);
// 7

splice、slice

splice:通过删除或替换现有元素或者添加新元素来修改数组的内容。这个方法也是就地修改数组。

语法:array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

下面的代码示例的意思是:在数组的位置 1 上删除 0 个元素,并插入 b。

let arr = ['a', 'c', 'd', 'e'];
arr.splice(1, 0, 'b');

slice:从指定的起始位置和结束位置之前(即前闭后开)返回数组的浅拷贝。如果未指定结束位置,则返回数组的其余部分。这个方法不会修改数组,只是返回所需的子集。

语法:arr.slice([begin[, end]])

let arr = ['a', 'b', 'c', 'd', 'e', 'f'];
const sliced = arr.slice(2, 4);
console.log(sliced);
// ['c', 'd']
console.log(arr);
// ['a', 'b', 'c', 'd', 'e']

小结一下

  • 所有插入元素的方法,比如 pushunshift 一律返回数组新的长度;
  • 所有删除元素的方法,比如 popshiftsplice 一律返回删除的元素,或者返回删除的多个元素组成的数组;

格式化

concat

concat:用于合并两个或多个数组,返回一个新数组。

语法:var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// output: Array ["a", "b", "c", "d", "e", "f"]

flat

flat:按照一个可指定的深度递归遍历数组,将深层次的数组进行扁平化。

语法:arr.flat([depth])

depth:数组的深度,如果不知道有多少层,可以设置为Infinity

const arr1 = [0, 1, 2, [3, 4]];
console.log(arr1.flat());
// output: [0, 1, 2, 3, 4]

const arr2 = [0, 1, 2, [[[3, 4]]]];
console.log(arr2.flat(2));
// output: [0, 1, 2, [3, 4]]

fill

fill:用一个固定值进行填充,可设置起止位置(不包括中止索引的位置)。

语法:arr.fill(value[, start[, end]])

[1, 2, 3].fill(4);               // [4, 4, 4]
[1, 2, 3].fill(4, 1);            // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2);         // [1, 4, 3]

from

from:从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

语法:Array.from(arrayLike[, mapFn[, thisArg]])

arrayLike:伪数组对象/可迭代对象(例如Set/Map对象、函数里面的参数对象 arguments、用 getElementsByTagName/ClassName/Name 获得的 HTMLCollection、用 querySelector 获得的 NodeList

mapFn:可选参数,如果指定了该参数,新数组中的每一项都会执行该回调函数;

thisArg:可选参数,执行回调函数时的 this 对象;

console.log(Array.from('foo'));
// output: Array ["f", "o", "o"]

console.log(Array.from([1, 2, 3], x => x + x));
// output: Array [2, 4, 6]

const set = new Set(['foo', 'bar', 'baz', 'foo']);
Array.from(set);
// output: [ "foo", "bar", "baz" ]

const map = new Map([[1, 2], [2, 4], [4, 8]]);
Array.from(map);
// output: [[1, 2], [2, 4], [4, 8]]

reverse

reverse:将数组中元素的位置颠倒,该方法会修改原数组。

const array1 = ['one', 'two', 'three'];
console.log('array1:', array1);
// output: "array1:" Array ["one", "two", "three"]

sort

sort:根据提供的函数对数组进行排序。这个方法就地修改数组。如果函数返回负数或 0,则顺序保持不变。如果返回正数,则交换元素顺序。

let arr = [1, 7, 3, -1, 5, 7, 2];
const sorter = (firstEl, secondEl) => firstEl - secondEl;
arr.sort(sorter);
console.log(arr);
// [-1, 1, 2, 3, 5, 7, 7]

toString

toString:返回一个字符串,表示指定的数组及其元素。

const array1 = [1, 2, 'a', '1a'];
console.log(array1.toString());
// output: "1,2,a,1a"

面对嵌套数组,toString 也可以实现类似于 flat 方法的扁平化处理

[1, [2, [3, 4]]].toString(); // "1,2,3,4"

转换

join

join:将一个数组(或者类数组)内的所有元素拼接成一个字符串。

语法:arr.join([separator])

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// output: "Fire,Air,Water"

console.log(elements.join(''));
// output: "FireAirWater"

console.log(elements.join('-'));
// output: "Fire-Air-Water"

reduce

reduce:基于给定函数累加值。

语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

accumulator:累计计数;

currentValue:正在处理的项;

const arr = [1, 2, 3, 4, 5, 6];
const reduced = arr.reduce((total, current) => total + current);
console.log(reduced);
// 21

keys

keys:返回一个包含数组中每个索引键的 Array Iterator 对象。

const array1 = ['a', 'b', 'c'];
const iterator = array1.keys();

for (const key of iterator) {
  console.log(key);
}

// output: 0
// output: 1
// output: 2

values

values:返回一个包含数组中每个索引值的 Array Iterator 对象。

const array1 = ['a', 'b', 'c'];
const iterator = array1.values();

for (const value of iterator) {
  console.log(value);
}

// output: "a"
// output: "b"
// output: "c"

JS基础 - 数组操作方法合集

https://hashencode.github.io/post/3c35ed16/

作者

BiteByte

发布于

2020-08-08

更新于

2024-11-15

许可协议