【JavaScript】常见数组函数解释及示例汇总


前言

本文主要面向前端网页开发的用户和读者,详细介绍了JavaScript中数组函数的应用。


一、JavaScript是什么?

简称:JS,是一门动态的编程语言。主要应用于前端网页开发,增强网页的交互性和动态性。包括事件处理、表单验证、动画创建等多种功能。
基于JS的流行框架有:Vue.js、Bootstrap、React…

二、常见数组函数解释及语法

1.push()

释义:用于将新元素添加到数组的末尾,并返回新的数组长度。

语法

array.push(element1, ..., elementN)
  • array 是要添加元素的数组。
  • element1, …, elementN 是要添加到数组末尾的元素。
  • 可以添加多个元素。

示例

let fruits = ['Apple', 'Banana'];  
  
// 添加一个元素  
fruits.push('Cherry');  
console.log(fruits); // 输出: ['Apple', 'Banana', 'Cherry']  
  
// 添加多个元素  
fruits.push('Date', 'Elderberry');  
console.log(fruits); // 输出: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']  
  
// 获取新数组的长度  
let newLength = fruits.push('Fig');  
console.log(newLength); // 输出: 6  
console.log(fruits); // 输出: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig']

2.pop()

释义:用于移除数组中的最后一个元素,并返回该元素的值。

语法

array.pop()

示例

let fruits = ['Apple', 'Banana', 'Cherry'];  
  
// 移除并返回最后一个元素  
let lastFruit = fruits.pop();  
console.log(lastFruit); // 输出: 'Cherry'  
console.log(fruits);    // 输出: ['Apple', 'Banana']  
  
// 尝试从一个空数组中移除元素  
let emptyArray = [];  
let result = emptyArray.pop();  
console.log(result);    // 输出: undefined  
console.log(emptyArray);// 输出: []

应用场景:pop() 方法通常用于需要从数组末尾移除元素的场景,例如实现一个栈(后进先出)数据结构时。在栈的实现中,push() 方法用于添加元素到栈顶,而 pop() 方法则用于移除并返回栈顶的元素。

3.shift()

释义:用于移除数组中的第一个元素,并返回该元素的值。同时,数组的长度会相应减少1,其余元素会向前移动一位以填补被移除元素的位置。

语法

array.shift()

示例

let fruits = ['Banana', 'Orange', 'Apple', 'Mango'];  
  
// 移除第一个元素 'Banana'  
let removedFruit = fruits.shift();  
  
console.log(fruits); // 输出: ['Orange', 'Apple', 'Mango']  
console.log(removedFruit); // 输出: 'Banana'  
  
// 尝试在空数组上使用 shift()  
let emptyArray = [];  
let result = emptyArray.shift();  
  
console.log(emptyArray); // 输出: []  
console.log(result); // 输出: undefined

应用场景:shift() 方法常用于需要按先进先出(FIFO)顺序处理元素的场景,例如任务队列、消息队列等。然而,在性能敏感的场合,应考虑使用更适合这种操作的数据结构。

4.unshift()

释义: 用于在数组的开头添加一个或多个元素,并返回新的数组长度。

语法

array.unshift(element1, ..., elementN)
  • element1, …, elementN:这些参数代表要添加到数组开头的元素。你可以一次性添加多个元素。

示例

let numbers = [2, 3, 4];  
  
// 在数组开头添加元素1  
let newLength = numbers.unshift(1);  
  
console.log(numbers); // 输出结果: [1, 2, 3, 4]  
console.log(newLength); // 输出结果: 4,表示新数组的长度  
  
// 一次性在数组开头添加多个元素  
numbers.unshift(-2, -1);  
  
console.log(numbers); // 输出结果: [-2, -1, 1, 2, 3, 4]

5.every()

释义:用于测试数组的所有元素是否都通过了指定函数的测试。如果数组中每个元素都执行了提供的函数,并且都返回 true,则 every() 方法返回 true;否则,它返回 false。

语法

array.every(function(currentValue, index, arr), thisValue)
  • currentValue:数组中当前正在处理的元素。
  • index(可选):当前元素的索引。
  • arr(可选):调用 every()方法的数组对象。
  • thisValue(可选):当执行回调函数时,用作 this 的值。如果省略了这个参数,this 的值在非严格模式下将是全局对象(在浏览器中通常是 window),而在严格模式(‘use strict’;)下将是 undefined。

示例

// 检查数组中的所有元素是否都大于10  
let numbers = [12, 5, 8, 130, 44];  
  
let allGreaterThanTen = numbers.every(function(item) {  
  return item > 10;  
});  
  
console.log(allGreaterThanTen); // 输出: false  
  
// 使用箭头函数检查数组中的所有元素是否都是偶数(推荐)
let evens = [2, 4, 6, 8];  
  
let allEven = evens.every(item => item % 2 === 0);  
  
console.log(allEven); // 输出: true

// 使用thisValue
let person = {  
  age: 20,  
  isAdult: function(age) {  
    return age >= 18;  
  }  
};  
  
let ages = [19, 22, 25];  
  
// 使用 every() 方法和 thisValue  
let allAdults = ages.every(function(age) {  
  // 在这里,this 指向 person 对象  
  return this.isAdult(age);  
}, person); // 注意这里传递了 person 作为 thisValue  
  
console.log(allAdults); // 输出: true

6.slice()

释义:用于从一个已有的数组中返回一个浅拷贝的新数组对象,该新数组对象包含从原数组中选定的元素。这个方法不会修改原数组,而是返回一个新数组。

语法

array.slice([begin[, end]])
  • begin(可选):指定从哪个索引位置开始提取。如果该参数为负数,则表示从数组末尾开始的第几个元素开始提取。如果省略该参数,则默认从索引0开始。
  • end(可选):指定提取到哪个索引位置结束(不包括该索引位置的元素)。如果该参数为负数,则表示提取到数组末尾倒数第几个元素之前。如果省略该参数,则默认提取到数组末尾。

示例

let fruits = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'];  
  
// 提取从索引1到索引3(不包括索引3)的元素  
let slicedFruits = fruits.slice(1, 3);  
  
console.log(slicedFruits); // 输出: ['Banana', 'Cherry']  
console.log(fruits); // 输出: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'](原数组未被修改)  
  
// 省略end参数,提取从索引2到数组末尾的所有元素  
let slicedFruits2 = fruits.slice(2);  
  
console.log(slicedFruits2); // 输出: ['Cherry', 'Date', 'Elderberry']  
  
// 使用负数索引  
let slicedFruits3 = fruits.slice(-3, -1);  
  
console.log(slicedFruits3); // 输出: ['Cherry', 'Date'](从倒数第三个元素开始,到倒数第一个元素之前结束)

7.splice()

释义:允许在数组中添加、删除或替换现有元素。与 slice() 方法不同,splice() 会直接修改原数组,并返回由被删除元素组成的新数组(如果没有删除元素,则返回空数组)。

语法

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
  • start:指定修改的开始位置(索引)。如果该索引为负,则表示从数组末尾开始的第几个位置。
  • deleteCount(可选):一个整数,表示要移除的数组元素的个数。如果 deleteCount 是 0 或省略,则不会移除元素。在这种情况下,你至少应该指定一个要添加的新元素。如果 deleteCount 大于实际要删除的元素个数,则所有从 start 位置开始的元素都会被删除。
  • item1, item2, …(可选):要添加进数组的元素,从 start 位置开始。如果不指定,则 splice() 将只删除数组元素。

示例

let myFish = ['angel', 'clown', 'mandarin', 'surgeon'];  
  
// 从索引2的位置开始删除0个元素,并添加'drum'  
let removed = myFish.splice(2, 0, 'drum');  
  
console.log(myFish); // ['angel', 'clown', 'drum', 'mandarin', 'surgeon']  
console.log(removed); // [](没有元素被删除)  
  
// 从索引3的位置开始删除1个元素  
removed = myFish.splice(3, 1);  
  
console.log(myFish); // ['angel', 'clown', 'drum', 'surgeon']  
console.log(removed); // ['mandarin'](被删除的元素)  
  
// 从索引2的位置开始删除2个元素,并添加'trumpet'和'parrot'  
removed = myFish.splice(2, 2, 'trumpet', 'parrot');  
  
console.log(myFish); // ['angel', 'clown', 'trumpet', 'parrot', 'surgeon']  
console.log(removed); // ['drum', 'surgeon'](被删除的元素)  
  
// 使用负数索引  
removed = myFish.splice(-3, 1);  
  
console.log(myFish); // ['angel', 'clown', 'parrot', 'surgeon']  
console.log(removed); // ['trumpet'](被删除的元素)

应用场景:splice() 方法非常适用于需要在数组中间添加、删除或替换元素的场景。由于它会直接修改原数组,因此在使用时需要注意这一点,以避免对原始数据造成意外的修改。

8.map()

释义:是一个高阶函数,它创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。map() 方法不会改变原始数组,而是返回一个新数组。(常用)

语法

array.map(callback(currentValue[, index[, array]])[, thisArg])
  • callback:生成新数组元素的回调函数,该函数可以接收三个参数:
  • currentValue:数组中正在处理的当前元素。
  • index(可选):数组中正在处理的当前元素的索引。
  • array(可选):调用 map() 方法的数组。
  • thisArg(可选):执行 callback 函数时 this 关键字被设置的的值。如果没有提供此参数,则 this 的值在非严格模式下将是全局对象,而在严格模式(use strict)下将是 undefined。(不常用)

示例

const numbers = [1, 2, 3, 4, 5];  
  
// 将数组中的每个元素乘以2  
const doubled = numbers.map(function(number) {  
  return number * 2;  
});  
  
console.log(doubled); // 输出: [2, 4, 6, 8, 10]  
  
// 使用箭头函数 (简化)
const doubledArrow = numbers.map(number => number * 2);  
  
console.log(doubledArrow); // 输出: [2, 4, 6, 8, 10]  
  
// 使用第二个参数(索引)  
const indexed = numbers.map((number, index) => `Number ${index}: ${number}`);  
  
console.log(indexed); // 输出: ["Number 0: 1", "Number 1: 2", "Number 2: 3", "Number 3: 4", "Number 4: 5"]  
  
// 使用thisArg参数(不常见)  
function Prefixer(prefix) {  
  this.prefix = prefix;  
}  
  
Prefixer.prototype.prefixArray = function(arr) {  
  return arr.map(function(x) {  
    return this.prefix + x;  
  }, this); // 注意这里的thisArg  
};  
  
const pre = new Prefixer('Hello, ');  
console.log(pre.prefixArray(['Alice', 'Bob'])); // 输出: ["Hello, Alice", "Hello, Bob"]

应用场景:在实际开发中,需要对对象数组中的属性处理后,输出新的对象数组。

9.filter()

释义:是一个高阶函数,filter() 方法会遍历数组中的每个元素,并对每个元素执行提供的回调函数。如果回调函数返回 true,则该元素会被包含在返回的新数组中;如果返回 false,则该元素会被排除。

语法

array.filter(callback(currentValue[, index[, array]])[, thisArg])

callback:用来测试每个元素的回调函数,该函数可以接收三个参数:

  • currentValue:数组中正在处理的当前元素。
  • index(可选):数组中正在处理的当前元素的索引。
  • array(可选):调用 filter() 方法的数组。

thisArg(可选):执行 callback 函数时 this 关键字被设置的的值。如果没有提供此参数,则 this 的值在非严格模式下将是全局对象,而在严格模式(use strict)下将是 undefined。

示例

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];  
  
// 筛选出数组中的偶数  
const evens = numbers.filter(function(number) {  
  return number % 2 === 0;  
});  
  
console.log(evens); // 输出: [2, 4, 6, 8, 10]  
  
// 使用箭头函数  
const evensArrow = numbers.filter(number => number % 2 === 0);  
  
console.log(evensArrow); // 输出: [2, 4, 6, 8, 10]  
  
// 筛选出数组中大于5的元素  
const greaterThanFive = numbers.filter(number => number > 5);  
  
console.log(greaterThanFive); // 输出: [6, 7, 8, 9, 10]  
  
// 使用thisArg参数(不常见)  
function isEven(element) {  
  // 注意:这里的this.threshold在调用filter时由thisArg提供  
  return element % this.threshold === 0;  
}  
  
const obj = {  
  threshold: 2  
};  
  
const filtered = [1, 2, 3, 4, 5, 6].filter(isEven, obj); // 传入obj作为thisArg  
  
console.log(filtered); // 输出: [2, 4, 6],因为2, 4, 6都能被obj.threshold(即2)整除

应用场景:filter() 方法非常适合于从数组中筛选出满足特定条件的元素,并返回一个新数组。

10.find()

释义:用于查找数组中满足提供的测试函数的第一个元素。它返回数组中满足提供的测试函数的第一个元素的值。如果没有找到,则返回 undefined。

语法

array.find(callback(currentValue[, index[, array]])[, thisArg])

callback:在数组每一项上执行的函数,接收三个参数:

  • currentValue:数组中正在处理的当前元素。
  • index(可选):数组中正在处理的当前元素的索引。
  • array(可选):调用 find() 方法的数组。

thisArg(可选):执行 callback 函数时 this 关键字被设置的的值。如果没有提供此参数,则 this 的值在非严格模式下将是全局对象,而在严格模式(use strict)下将是 undefined。

示例

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];  
  
// 查找数组中第一个大于5的元素  
const firstGreaterThanFive = numbers.find(function(number) {  
  return number > 5;  
});  
  
console.log(firstGreaterThanFive); // 输出: 6  
  
// 使用箭头函数 (简化形式)
const firstGreaterThanFiveArrow = numbers.find(number => number > 5);  
  
console.log(firstGreaterThanFiveArrow); // 输出: 6  
  
// 查找数组中第一个值为偶数的元素  
const firstEven = numbers.find(number => number % 2 === 0);  
  
console.log(firstEven); // 输出: 2  
  
// 如果没有找到满足条件的元素,则返回undefined  
const notFound = numbers.find(number => number > 10);  
  
console.log(notFound); // 输出: undefined  
  
// 使用thisArg参数(不常见)  
function findFirstEven(element) {  
  // 注意:这里的this.divisor在调用find时由thisArg提供  
  return element % this.divisor === 0;  
}  
  
const obj = {  
  divisor: 2  
};  
  
const found = [1, 3, 5, 6, 9].find(findFirstEven, obj); // 传入obj作为thisArg  
  
console.log(found); // 输出: 6,因为6能被obj.divisor(即2)整除,并且是第一个满足条件的元素

应用场景:find() 方法非常适合于从数组中查找满足特定条件的第一个元素。

11.reduce()

释义:对数组中的每个元素执行一个提供的函数(升级函数),将其结果汇总为单个值。这个方法非常强大,可以用于执行各种数据转换和汇总操作。

语法

array.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

callback:执行数组中每个值的函数,包含四个参数:

  • accumulator:累计器累计回调的返回值。它是上一次调用回调时返回的累积值,或者是 initialValue(如果提供了的话)。
  • currentValue:数组中正在处理的当前元素。
  • index(可选):数组中正在处理的当前元素的索引。如果提供了 initialValue,则索引从0开始;否则从1开始。
  • array(可选):调用 reduce() 方法的数组。

initialValue(可选):作为第一次调用 callback 函数时的第一个参数的值。如果没有提供初始值,则将使用数组的第一个元素作为初始值,同时 callback 将从第二个元素开始执行。

示例

const numbers = [1, 2, 3, 4, 5];  
  
// 计算数组所有元素的总和  
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);  
  
console.log(sum); // 输出: 15  
  
// 计算数组所有元素的乘积  
const product = numbers.reduce((accumulator, currentValue) => accumulator * currentValue, 1);  
  
console.log(product); // 输出: 120  
  
// 将数组元素连接成一个字符串  
const concatenated = ['a', 'b', 'c', 'd'].reduce((accumulator, currentValue) => accumulator + currentValue, '');  
  
console.log(concatenated); // 输出: 'abcd'  
  
// 使用索引来生成一个包含元素和索引的对象数组  
const indexedArray = numbers.reduce((accumulator, currentValue, index) => {  
  accumulator.push({ index, value: currentValue });  
  return accumulator;  
}, []);  
  
console.log(indexedArray); // 输出: [{ index: 0, value: 1 }, { index: 1, value: 2 }, { index: 2, value: 3 }, { index: 3, value: 4 }, { index: 4, value: 5 }]

应用场景:reduce() 方法非常适合于执行数组元素的累积操作,如求和、求积、连接字符串等,以及更复杂的数组转换和汇总操作。

12.forEach()

释义:用于遍历数组中的每一个元素,并对每个元素执行一次提供的函数。这个方法不会改变原始数组,也不会返回新的数组,它只是用于执行副作用(即在函数内部执行某些操作,如打印输出、修改外部变量等)。

语法

array.forEach(callback(currentValue[, index[, array]])[, thisArg])

callback:为数组中每个元素执行的函数,该函数接收三个参数:

  • currentValue:数组中正在处理的当前元素。
  • index(可选):数组中正在处理的当前元素的索引。
  • array(可选):调用 forEach() 方法的数组。

thisArg(可选):当执行回调函数时,用作 this 的值。如果没有提供此参数,则 this 的值在非严格模式下将是全局对象(在浏览器中通常是 window),而在严格模式(use strict)下将是 undefined。

示例

const numbers = [1, 2, 3, 4, 5];  
  
// 打印数组中的每个元素  
numbers.forEach(function(number) {  
  console.log(number);  
});  
  
// 使用箭头函数打印数组中的每个元素  
numbers.forEach(number => console.log(number));  
  
// 使用索引和数组对象  
numbers.forEach((number, index, array) => {  
  console.log(`Element at index ${index} is ${number}`);  
  // 注意:不要在这里修改array,因为forEach不会创建新数组  
});  
  
// 使用thisArg参数(不常见)  
function logElement(element) {  
  console.log(this.prefix + ': ' + element);  
}  
  
const obj = {  
  prefix: 'Number'  
};  
  
numbers.forEach(logElement, obj); // 传入obj作为thisArg  
// 输出: Number: 1, Number: 2, Number: 3, Number: 4, Number: 5

总结

JavaScript提供了大量能使我们快速便捷地处理数据的函数和方法,在我们的日常开发中,有时会结合需求和业务场景,组合使用不同的函数来实现复杂的功能逻辑。

以上内容就是这些,如有缺漏或不足欢迎指正和补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值