深入讲解Javascript中的常用数组操作函数

一、数组操作方法:增删改查的核心工具

1. push()

在 JavaScript 里,push() 方法的主要功能是在数组的末尾添加一个或多个元素,并且会返回添加元素后数组的新长度。需要特别注意的是,该方法会直接对原数组进行修改。

以下是一个简单的示例:

ini 复制代码
const fruits = ['apple', 'banana'];
const newLength = fruits.push('cherry', 'date');

console.log(fruits); 
console.log(newLength); 

在这个例子中,首先定义了一个包含 'apple''banana' 的数组 fruits。接着使用 push() 方法添加了 'cherry''date' 两个元素。此时,fruits 数组被修改为 ['apple', 'banana', 'cherry', 'date'],而 newLength 的值为 4,也就是新数组的长度。

2. pop()

pop() 方法的作用是移除数组的最后一个元素,并且返回被移除的元素。同样,它也会直接修改原数组。

看下面这个示例:

ini 复制代码
const numbers = [1, 2, 3, 4];
const lastNumber = numbers.pop();

console.log(numbers); 
console.log(lastNumber); 

在这个例子中,numbers 数组原本包含 1234 四个元素。使用 pop() 方法后,最后一个元素 4 被移除,数组变为 [1, 2, 3],而 lastNumber 的值就是被移除的 4

3. shift()

shift() 方法用于移除数组的第一个元素,并返回该元素。和前面的方法一样,它会直接修改原数组。

示例如下:

ini 复制代码
const animals = ['dog', 'cat', 'bird'];
const firstAnimal = animals.shift();

console.log(animals); 
console.log(firstAnimal); 

在这个例子中,animals 数组最初包含 'dog''cat''bird'。调用 shift() 方法后,第一个元素 'dog' 被移除,数组变为 ['cat', 'bird']firstAnimal 的值就是 'dog'

4. unshift()

unshift() 方法可以在数组的开头添加一个或多个元素,然后返回添加元素后数组的新长度。它同样会直接修改原数组。

示例代码如下:

ini 复制代码
const colors = ['red', 'green'];
const newLength = colors.unshift('blue', 'yellow');

console.log(colors); 
console.log(newLength); 

在这个例子中,colors 数组原本包含 'red''green'。使用 unshift() 方法添加 'blue''yellow' 后,数组变为 ['blue', 'yellow', 'red', 'green']newLength 的值为 4,即新数组的长度。

5. splice()

splice() 方法堪称数组操作的 "瑞士军刀",它可以实现删除、插入和替换元素的功能。其语法为 array.splice(start, deleteCount, item1, item2, ...),其中 start 是开始操作的索引位置,deleteCount 是要删除的元素个数,item1, item2, ... 是要插入的元素。该方法会直接修改原数组,并返回一个包含被删除元素的数组。

下面是几个不同场景的示例:

删除元素

ini 复制代码
const numbers = [1, 2, 3, 4, 5];
const removed = numbers.splice(2, 2);

console.log(numbers); 
console.log(removed); 

在这个例子中,从索引 2 开始删除 2 个元素。numbers 数组变为 [1, 2, 5]removed 数组包含被删除的元素 [3, 4]

插入元素

ini 复制代码
const letters = ['a', 'b', 'e'];
letters.splice(2, 0, 'c', 'd');

console.log(letters); 

这里从索引 2 开始,不删除任何元素(deleteCount0),插入 'c''d'。最终 letters 数组变为 ['a', 'b', 'c', 'd', 'e']

替换元素

ini 复制代码
const fruits = ['apple', 'banana', 'cherry'];
const replaced = fruits.splice(1, 1, 'date');

console.log(fruits); 
console.log(replaced); 

在这个例子中,从索引 1 开始删除 1 个元素('banana'),并插入 'date'fruits 数组变为 ['apple', 'date', 'cherry']replaced 数组包含被替换掉的元素 ['banana']

6. slice()

slice() 方法用于从原数组中提取一部分元素,组成一个新数组,而不会修改原数组。其语法为 array.slice(start, end),其中 start 是开始提取的索引,end 是结束提取的索引(不包含该索引对应的元素)。如果省略 end 参数,则会提取从 start 到数组末尾的所有元素。

示例如下:

ini 复制代码
const numbers = [1, 2, 3, 4, 5];
const newNumbers = numbers.slice(1, 3);

console.log(numbers); 
console.log(newNumbers); 

在这个例子中,从索引 1 开始到索引 3(不包含索引 3 对应的元素)提取元素。numbers 数组保持不变,仍然是 [1, 2, 3, 4, 5],而 newNumbers 数组包含提取的元素 [2, 3]

二、数组迭代方法:遍历与数据处理的利器

1. forEach()

forEach() 方法会对数组中的每个元素执行一次提供的回调函数,没有返回值,主要用于执行一些副作用操作,比如打印日志、修改全局变量等。回调函数接受三个参数:当前元素的值、当前元素的索引和原数组。

示例如下:

typescript 复制代码
const numbers = [1, 2, 3];
numbers.forEach((number, index, array) => {
    console.log(`索引 ${index} 的值是 ${number},原数组是 ${array}`);
});

在这个例子中,forEach() 方法会依次对 numbers 数组中的每个元素执行回调函数。对于每个元素,会打印出其索引、值以及原数组。需要注意的是,forEach() 方法不能使用 breakcontinue 语句来控制循环,因为它不是传统意义上的循环结构。

2. map()

map() 方法会创建一个新数组,新数组中的每个元素都是原数组中对应元素经过回调函数处理后的结果。回调函数接受三个参数:当前元素的值、当前元素的索引和原数组。

示例如下:

typescript 复制代码
const numbers = [1, 2, 3];
const squaredNumbers = numbers.map((number) => number * number);

console.log(numbers); 
console.log(squaredNumbers); 

在这个例子中,map() 方法对 numbers 数组中的每个元素进行平方操作,然后将结果存储在 squaredNumbers 数组中。原数组 numbers 保持不变,而 squaredNumbers 数组变为 [1, 4, 9]

3. filter()

filter() 方法会创建一个新数组,新数组中的元素是原数组中满足回调函数条件的元素。回调函数接受三个参数:当前元素的值、当前元素的索引和原数组,并且需要返回一个布尔值。

示例如下:

ini 复制代码
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter((number) => number % 2 === 0);

console.log(numbers); 
console.log(evenNumbers); 

在这个例子中,filter() 方法会筛选出 numbers 数组中的偶数元素,然后将它们存储在 evenNumbers 数组中。原数组 numbers 保持不变,而 evenNumbers 数组变为 [2, 4]

4. reduce()

reduce() 方法会对数组中的每个元素执行一个 reducer 函数,将其结果汇总为单个返回值。reducer 函数接受四个参数:累加器(上一次调用 reducer 的返回值)、当前元素的值、当前元素的索引和原数组。此外,reduce() 方法还可以接受一个可选的初始值作为累加器的初始值。

示例如下:

javascript

ini 复制代码
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);

console.log(sum); 

在这个例子中,reduce() 方法会对 numbers 数组中的元素进行求和操作。初始值为 0,累加器从 0 开始,依次加上数组中的每个元素。最终 sum 的值为 10

如果不提供初始值,reduce() 方法会将数组的第一个元素作为累加器的初始值,并从第二个元素开始执行 reducer 函数。

三、数组排序和反转方法:数据顺序的掌控者

1. sort()

sort() 方法用于对数组中的元素进行排序。默认情况下,它会将元素转换为字符串,并按照 Unicode 码点进行排序。这可能会导致一些意外的结果,特别是对于数字数组。因此,通常需要传入一个比较函数来指定排序规则。

比较函数接受两个参数 ab,并返回一个数字:

  • 如果返回值小于 0,则 a 排在 b 前面。

  • 如果返回值等于 0,则 ab 的顺序不变。

  • 如果返回值大于 0,则 b 排在 a 前面。

示例如下:

css 复制代码
const numbers = [3, 1, 4, 2];
numbers.sort((a, b) => a - b);

console.log(numbers); 

在这个例子中,传入的比较函数 (a, b) => a - b 表示按照升序排序。最终 numbers 数组变为 [1, 2, 3, 4]

2. reverse()

reverse() 方法用于反转数组中元素的顺序,它会直接修改原数组。

示例如下:

ini 复制代码
const numbers = [1, 2, 3];
numbers.reverse();

console.log(numbers); 

在这个例子中,reverse() 方法将 numbers 数组中的元素顺序反转,最终数组变为 [3, 2, 1]

四、其他方法:细节场景的解决方案

1. join()

join() 方法用于将数组中的所有元素连接成一个字符串。可以传入一个可选的分隔符参数,用于指定元素之间的分隔符,默认分隔符是逗号。

示例如下:

ini 复制代码
const fruits = ['apple', 'banana', 'cherry'];
const fruitString = fruits.join(' - ');

console.log(fruitString); 

在这个例子中,使用 ' - ' 作为分隔符,将 fruits 数组中的元素连接成一个字符串。最终 fruitString 的值为 'apple - banana - cherry'

2. concat()

concat() 方法用于合并两个或多个数组,返回一个新数组,原数组保持不变。它可以接受数组或单个元素作为参数。

示例如下:

ini 复制代码
const arr1 = [1, 2];
const arr2 = [3, 4];
const arr3 = arr1.concat(arr2, 5);

console.log(arr1); 
console.log(arr2); 
console.log(arr3); 

在这个例子中,concat() 方法将 arr1arr2 数组和元素 5 合并成一个新数组 arr3。原数组 arr1arr2 保持不变,arr3 数组变为 [1, 2, 3, 4, 5]

五、总结:灵活运用成就高效开发

JavaScript 的数组方法构成了一个功能丰富的工具集,涵盖了从简单的增删改查操作到复杂的数据处理和排序等多个方面。在实际开发中,需要根据具体的需求选择合适的方法,同时要注意方法是否会修改原数组,避免出现意外的副作用。通过熟练掌握这些方法,可以更高效地操作数组,编写出简洁、优雅的代码。

希望这篇博客能帮助你全面深入地理解 JavaScript 中 Array 方法的使用技巧,在实际开发中更加得心应手!

相关推荐
小墨宝15 分钟前
js 生成pdf 并上传文件
前端·javascript·pdf
HED31 分钟前
用扣子快速手撸人生中第一个AI智能应用!
前端·人工智能
DN金猿35 分钟前
使用npm install或cnpm install报错解决
前端·npm·node.js
丘山子35 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
志存高远661 小时前
Kotlin 的 suspend 关键字
前端
www_pp_1 小时前
# 构建词汇表:自然语言处理中的关键步骤
前端·javascript·自然语言处理·easyui
YuShiYue1 小时前
pnpm monoreop 打包时 node_modules 内部包 typescript 不能推导出类型报错
javascript·vue.js·typescript·pnpm
天天扭码2 小时前
总所周知,JavaScript中有很多函数定义方式,如何“因地制宜”?(ˉ﹃ˉ)
前端·javascript·面试
一个专注写代码的程序媛2 小时前
为什么vue的key值,不用index?
前端·javascript·vue.js
장숙혜2 小时前
ElementUi的Dropdown下拉菜单的详细介绍及使用
前端·javascript·vue.js