JavaScript数组方法对比

JavaScript 提供了多种新增,移除,替换数组元素的方法,但是有些会影响原来的数组;有些则不会,它是新建了一个数组。

JavaScript数组方法对比

JavaScript 提供了多种新增,移除,替换数组元素的方法,但是有些会影响原来的数组;有些则不会,它是新建了一个数组。

新增:影响原数组

使用 array.push() 和 array.ushift() 新增元素会影响原来的数组。

1
2
3
4
5
let mutatingAdd = ['a', 'b', 'c', 'd', 'e'];

mutatingAdd.push('f'); // ['a', 'b', 'c', 'd', 'e', 'f']

mutatingAdd.unshift('z'); // ['z', 'a','b', 'c', 'd', 'e' 'f']

新增:不影响原数组

两种方式新增元素不会影响原数组,第一种是 array.concat() 。

1
2
3
4
5
const arr1 = ['a', 'b', 'c', 'd', 'e'];

const arr2 = arr1.concat('f'); // ['a', 'b', 'c', 'd', 'e', 'f']

console.log(arr1); // ['a', 'b', 'c', 'd', 'e']

第二种方法是使用 JavaScript 的展开(spread)操作符,展开操作符是三个点(…)

1
2
3
4
5
const arr1 = ['a', 'b', 'c', 'd', 'e'];

const arr2 = [...arr1, 'f']; // ['a', 'b', 'c', 'd', 'e', 'f']

const arr3 = ['z', ...arr1]; // ['z', 'a', 'b', 'c', 'd', 'e']

展开操作符会复制原来的数组,从原数组取出所有元素,然后存入新的环境。

移除:影响原数组

使用 array.pop() 和 array.shift() 移除数组元素时,会影响原来的数组。

1
2
3
4
5
let mutatingRemove = ['a', 'b', 'c', 'd', 'e'];  

mutatingRemove.pop(); // ['a', 'b', 'c', 'd']

mutatingRemove.shift(); // ['b', 'c', 'd']

array.splice() 也可以删除数组的元素。

1
2
3
let mutatingRemove = ['a', 'b', 'c', 'd', 'e'];  

mutatingRemove.splice(0, 2); // ['c', 'd', 'e']

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

arrayObject.splice(index,howmany,item1,.....,itemX)
参数| 描述
—|—
index |必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany| 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, …, itemX |可选。向数组添加的新项目。

移除:不影响原数组

JavaScript 的 array.filter() 方法基于原数组创建一个新数组,新数组仅包含匹配特定条件的元素。

1
2
3
4
5
6
7
8
9
10
const arr1 = ['a', 'b', 'c', 'd', 'e'];

const arr2 = arr1.filter(a => a !== 'e'); // ['a', 'b', 'c', 'd']
// 或者

const arr2 = arr1.filter(a => {

return a !== 'e';

}); // ['a', 'b', 'c', 'd']

以上代码的条件是“不等于 ‘e’ ”,因此新数组(arr2)里面没有包含 ‘e’。

另一种不影响原数组的方式是 array.slice()(不要与 array.splice() 混淆)。

1
2
3
4
5
const arr1 = ['a', 'b', 'c', 'd', 'e'];  

const arr2 = arr1.slice(1, 5) // ['b', 'c', 'd', 'e']

const arr3 = arr1.slice(2) // ['c', 'd', 'e']

slice() 方法可从已有的数组中返回选定的元素。

语法
arrayObject.slice(start,end)
参数| 描述
—|—
start| 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end| 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

替换:影响原数组

可以使用 array.map() 创建一个新数组,并且可以检查每一个元素,根据特定的条件替换它们。

1
2
3
4
5
6
7
8
9
10
11
const arr1 = ['a', 'b', 'c', 'd', 'e']  

const arr2 = arr1.map(item => {

if(item === 'c') {
item = 'CAT';
}

return item;

}); // ['a', 'b', 'CAT', 'd', 'e']

使用 array.map() 转换数据

array.map() 是个强力方法,可以用于转换数据,而不污染原先的数据源。

1
2
3
4
5
const origArr = ['a', 'b', 'c', 'd', 'e'];  

const transformedArr = origArr.map(n => n + 'Hi!'); // ['aHi!', 'bHi!', 'cHi!', 'dHi!', 'eHi!']

console.log(origArr); // ['a', 'b', 'c', 'd', 'e']; // 原数组毫发无损


本作品采用 知识共享署名 2.5 中国大陆许可协议 进行许可,欢迎转载,但转载请注明来自JayMo,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文永久链接:http://jaymo666.github.io/2018/04/23/JavaScript数组方法对比/