当前位置: 首页 > article >正文

JavaScript 数组拓展:方法与实例全解析

一、引言

在 JavaScript 编程的广袤天地里,数组犹如万能的基石,稳稳承载着各式各样的数据处理与复杂逻辑构建的重任。随着 JavaScript 语言与时俱进、迭代更新,其数组拓展方法更是如繁花绽放,日益丰富强大,仿若为开发者精心打造了一把把通往高效编程巅峰的金钥匙。此刻,就让我们满怀热忱,深入这片知识的宝藏之地,细致入微地探究这些实用至极的数组拓展“神器”。

二、ES6 带来的数组新特性

(一)数组解构赋值

它就像是一位神奇的“数据解包大师”,以简洁且极具表现力的语法糖,让从数组中提取并赋值数据的过程变得如同囊中取物般轻而易举。试看以下示例:

const [a, b, c] = [10, 20, 30];

console.log(a); // 10

console.log(b); // 20

console.log(c); // 30

const [x,, z] = [5, 6, 7];

console.log(x); // 5

console.log(z); // 7

const [head,...tail] = [1, 2, 3, 4];

console.log(head); // 1

console.log(tail); // [2, 3, 4]

// 解构多维数组

const [ [m1, m2], [n1, n2] ] = [ [11, 12], [13, 14] ];

console.log(m1); // 11

console.log(n2); // 14

// 解构函数返回值

function getData() {

return [20, 30, 40];

}

const [p, q, r] = getData();

console.log(p); // 20

console.log(r); // 40

(二)数组的扩展运算符(...)

这无疑是一个神通广大的运算符,它以非凡的魔力极大地拓展了数组操作的边界,为开发者开启了诸多奇妙可能。在数组合并场景中:

const arr1 = [1, 2, 3];

const arr2 = [4, 5, 6];

const merged = [...arr1,...arr2];

console.log(merged); // [1, 2, 3, 4, 5, 6]

const arr2 = [7, 8, 9];

const combined = [0,...arr1,...arr2];

console.log(combined); // [0, 1, 2, 3, 7, 8, 9]

// 合并不同类型数据数组,如字符串数组与数字数组

const strArr = ['a', 'b', 'c'];

const numArr = [1, 2, 3];

const mixedArr = [...strArr,...numArr.map(String)];

console.log(mixedArr); // ['a', 'b', 'c', '1', '2', '3']

用于复制数组时:

const originalArray = [11, 12, 13];

const cloned = [...originalArray];

cloned.push(14);

console.log(originalArray); // [11, 12, 13]

console.log(cloned); // [11, 12, 13, 14]

// 深度复制多维数组(简易示例,对于复杂对象仍要完善)

const nestedOriginal = [[1, 2], [3, 4]];

const nestedCloned = nestedOriginal.map(subArr => [...subArr]);

nestedCloned[0].push(5);

console.log(nestedOriginal); // [[1, 2], [3, 4]]

console.log(nestedCloned); // [[1, 2, 5], [3, 4]]

在函数参数传递方面:

function multiplyAll(...nums) {

return nums.reduce((acc, num) => acc * num, 1);

}

console.log(multiplyAll(2, 3, 4)); // 24

function logNames(first, second,...rest) {

console.log(`First: ${first}, Second: ${second}`);

console.log(`Others: ${rest.join(', ')}`);

}

logNames('Alice', 'Bob', 'Charlie', 'David');

三、数组实例方法的拓展

(一)Array.from()

它宛如一位技艺精湛的“数据类型转换大师”,能够将类数组对象与可遍历对象精准无误地转换为真正的数组,为数据处理开辟坦途。像处理函数参数:

function listArgs() {

return Array.from(arguments).map(arg => arg * 2);

}

console.log(listArgs(1, 2, 3)); // [2, 4, 6]

function processFormData(form) {

const formDataArray = Array.from(form.elements).map(element => ({

name: element.name,

value: element.value

}));

return formDataArray;

}

// 假设已有 HTML 表单对象 form

const formArray = processFormData(form);

console.log(formArray);

function handleAjaxResponse(response) {

const dataArray = Array.from(response.data);

return dataArray.filter(item => item.isValid);

}

// 假设已有 AJAX 响应对象 response

const filteredData = handleAjaxResponse(response);

console.log(filteredData);

处理 DOM 元素集合:

const divs = document.querySelectorAll('div');

const divArray = Array.from(divs).map(div => div.textContent);

console.log(divArray);

const tableRows = document.querySelectorAll('tr');

const rowData = Array.from(tableRows, row => Array.from(row.querySelectorAll('td')).map(td => td.textContent));

console.log(rowData);

(二)Array.of()

它是解决数组字面量创建单元素数组时“歧义困境”的得力干将,确保创建的数组精准符合开发者的预期:

const singleNumber = Array.of(22);

console.log(singleNumber.length); // 1

console.log(singleNumber[0]); // 22

const multipleElements = Array.of(25, 26, 27);

console.log(multipleElements); // [25, 26, 27]

const emptyArray = Array.of();

console.log(emptyArray.length); // 0

const arrayWithZero = Array.of(0);

console.log(arrayWithZero.length); // 1

console.log(arrayWithZero[0]); // 0

(三)find() 与 findIndex()

find() 仿若一位目光如炬的“数据猎手”,能在茫茫数组元素中,以惊人的速度锁定满足特定条件的首个元素:

const numbersList = [30, 35, 40, 45];

const foundNumber = numbersList.find(num => num % 2 === 0);

console.log(foundNumber); // 40

const products = [

{ id: 1, name: 'Product A', inStock: false },

{ id: 2, name: 'Product B', inStock: true }

];

const availableProduct = products.find(product => product.inStock);

console.log(availableProduct.name); // 'Product B'

const users = [

{ id: 101, name: 'John', age: 25 },

{ id: 102, name: 'Alice', age: 30 },

{ id: 103, 104, name: 'Bob', age: 25 }

];

const userWithAge = users.find(user => user.age === 25);

console.log(userWithAge.name); // 'John'

const tasks = [

{ id: 1, description: 'Fix bug', completed: false },

{ id: 2, description: 'Add feature', completed: true }

];

const incompleteTask = tasks.find(task =>!task.completed);

console.log(incompleteTask.description); // 'Fix bug'

findIndex() 则如同“数据猎手”的指南针,相应地精准返回该元素的索引:

const index = numbersList.findIndex(num => num > 35);

console.log(index); // 2

const productIndex = products.findIndex(product => product.id === 2);

console.log(productIndex); // 1

const userIndex = users.findIndex(user => user.name => 'Alice');

console.log(userIndex); // 1

const taskIndex = tasks.findIndex(task => task.description === 'Add feature');

console.log(taskIndex); // 1

(四)fill()

它恰似一位匠心独运的“数组填充工匠”,能依据开发者的需求,对数组进行全方位填充,无论是整齐划一的整体填充,还是独具匠心的局部替换,都不在话下:

const emptyArray = new Array(6).fill(0);

console.log(emptyArray); // [0, 0, 0, 0, 0, 0]

const partialFill = [100, 200, 300].fill(99, 1, 2);

console.log(partialFill); // [100, 99, 300]

const customFill = [5, 10, 15, 20].fill(25, -2);

console.log(customFill); // [5, 10, 25, 25]

const negativeFill = new Array(5).fill(-1);

console.log(negativeFill); // [-1, -1, -1, -1, -1]

const customShapeFill = new Array(3).fill({}).map((obj, index) => {

obj.id = index;

return obj;

});

console.log(customShapeFill);

(五)copyWithin()

它宛如一位灵动的“数组元素搬运工”,在数组内部轻盈、灵活地复制元素,巧妙实现数据迁移,达成开发者的多样布局:

const sourceArray = [50, 60, 70, 80, 90];

sourceArray.copyWithin(1, 3);

console.log(sourceArray); // [50, 80, 90, 80, 90]

const customCopy = [15, 25, 35, 45].copyWithin(2, 0, 2);

console.log(customCopy); // [15, 25, 15, 45]

const reverseCopy = [10, 20, 30, 40].copyWithin(0, -1, -3, -1);

console.log(reverseCopy); // [40, 20, 30, 40]

const cyclicCopy = [1, 2, 3, 4].copyWithin(2, 0);

console.log(cyclicCopy); // [1, 2, 1, 2]

(六)entries()、keys() 与 values()

这组方法仿若为开发者精心配备的“数组遍历百宝箱”,提供了多元、丰富的遍历选择:

  • entries() 如同一位贴心的“索引 - 值向导”,让我们能在遍历数组时,同时精准获取索引与对应的值:
const sampleArray = [101, 102, 103];

for (const [idx, val] of sampleArray.entries()) {

console.log(`Index: ${idx}, Value: ${val}`);

}

const objectArray = [

{ id: 1, name: 'Item 1' },

{ id: 2, name: 'Item 2' }

];

for (const [index, item] of objectArray.entries()) {

console.log(`Index: ${index}, Object: ${JSON.stringify(item)}`);

}

const mixedArray = [10, 'hello', { key: 'value' }];

for (const [i, v] of mixedArray.entries()) {

console.log(`Index: ${i}, Value: ${JSON.stringify(v)}`);

}
  • keys() 则像一位专注的“索引导航员”,一心专注于返回精准的索引:
for (const key of sampleArray.keys()) {

console.log(key);

}

const sparseArray = [1,, 3];

for (const key of sparseArray.keys()) {

console.log(key);

}

const customSparseArray = [,, 5];

for (const key of customSparseArray.keys()) {

console.log(key);

}
  • values() 恰似一位执着的“值传递使者”,聚焦于源源不断地输出数组的值:
for (ategoria value of sampleArray.values()) {

console.log(value);

}

const stringArray = ['a', 'b', 'c'];

for (const value of stringArray.values()) {

console.log(value);

}

const numberArray = [1, 2, 3];

for (const value of numberArray.values()) {

console.log(value);

}

(七)flat() 与 flatMap()

flat() 仿若一位拥有“扁平化魔法”的大师,轻轻一挥魔法棒,便能将嵌套数组一键“拍平”,化繁为简:

const nestedArray = [[1, 2], [3, 4], [5, 6]];

const flattened = nestedArray.flat();

console.log(flattened); // [1, 2, 3, 4, 5, 6]

const deeplyNested = [[[1], [2]], [[3], [4]]];

const deeplyFlattened = deeplyNested.flat(2);

console.log(deeplyFlattened); // [1, 2, 3, 4]

const mixedNested = [1, [2, [3, 4]], 5];

const fullyFlattened = mixedNested.flat(Infinity);

console.log(fullyFlattened); // [1, 2, 3, 4, 5]

const stringNested = ['a', ['b', ['c']]];

const flatString = stringNested.flat();

console.log(flatString); // ['a', 'b', 'c']

flatMap() 则像是融合了 map 与 flat 双重魔力的“超级变换器”,先施展映射魔法,再以扁平化绝技收尾:

const numbersForFlatMap = [1, 2, 3];

const result = numbersForFlatMap.flatMap(num => [num, num * 2]);

console.log(result); // [1, 2, 2, 4, 3, 6]

const stringNumbers = ['1', '2', '3'];

const parsedAndDoubled = stringNumbers.flatMap(str => [Number(str), Number(str) * 2]);

console.log(parsedAndDoubled); // [1, 2, 2, 4, 3, 6]

const nestedObjects = [

{ id: 1, values: [10, 20] },

{ id: 2, values: [30, 40] }

];

const flattenedObjects = nestedObjects.flatMap(obj => obj.values);

console.log(flattenedObjects); // [10, 20, 30, 40]

(八)reduce() 与 reduceRight()

reduce() 宛如一位沉稳的“数据累积工匠”,能按部就班地对数组元素进行累积计算,逐步汇聚成开发者所需的结果:

const numbersToReduce = [5, 10, 15];

const sum = numbersToReduce.reduce((accumulator, current) => accumulator + current, 0);

console.log(sum); // 30

const product = numbersToReduce.reduce((acc, num) => acc * num, 1);

console.log(product); // 750

const people = [

{ name: 'John', age: 25 },

{ name: 'Alice', age: 30 },

{ name: 'Bob', age: 25 }

];

const totalAge = people.reduce((acc, person) => acc + person.age, 0);

console.log(totalAge); // 80

const words = ['hello', '世界', 'javascript'];

const concatenated = words.reduce((acc, word) => acc + ' ' + word, '');

console.log(concatenated); // 'hello 世界 javascript'

reduceRight() 则如同“数据累积工匠”的镜像分身,从右至左进行类似操作,在特定场景下发挥独特功效:

const reversedSum = numbersToReduce.reduceRight((acc, num) => acc + num, 0);

console.log(reversedSum); // 30

const numbersWithWeights = [10, 20, 30];

const weightedSum = numbersWithWe6ghts.reduceRight((acc, num, index) => acc + num * (index + 1), 0);

console.log(weightedSum); // 110

const operations = [

(a, b) => a + b,

(a, b) => a * b,

(a, b) => a - b

];

const resultValue = operations.reduceRight((acc, operation) => operation(acc, 5), 10);

console.log(resultValue); // 35

五、在实际项目中的应用

在一个电商项目的数据处理模块中,我们需要从后端获取的类似数组对象(如商品列表数据)转换为真正的数组,这时 Array.from () 就派上用场。利用 find () 和 findIndex () 可以快速定位满足特定条件的商品,比如查找价格最高的商品或特定品牌的商品。在展示商品列表时,使用 sort () 方法按照价格、销量等因素进行排序,提升用户体验。

在前端页面的交互逻辑中,当用户进行多项选择操作时,我们可以用数组的扩展运算符轻松合并用户选择的数据数组。而 includes () 可用于判断用户的操作是否重复,避免不必要的重复执行。

六、总结与展望

JavaScript 数组拓展方法为开发者们提供了诸多便利,无论是数据处理、逻辑实现还是用户体验优化,都离不开它们的身影。随着 JavaScript 的持续发展,相信数组相关的功能还会不断完善与创新。作为开发者,我们应熟练掌握这些现有方法,不断探索它们在实际项目中的更多应用场景,让我们的代码更加简洁、高效、健壮。让我们携手共进,在 JavaScript 编程的海洋中乘风破浪,书写更加精彩的代码篇章。


http://www.kler.cn/a/488693.html

相关文章:

  • LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念
  • 【ROS2】Qt事件循环和ROS2订阅机制一起使用有什么注意事项?
  • 提升 PHP 编码效率的 10 个实用函数
  • maven高级(day15)
  • 基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址
  • 搭建docker私有化仓库Harbor
  • 安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用
  • 微信小程序评分小程序ssm+论文源码调试讲解
  • linux下MySQL的数据存放
  • ISP架构方案
  • ASP.NET Core 中使用 Cookie 身份验证
  • 爬取b站评论
  • 智元机器人完成 1000 台通用具身机器人下线
  • 计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法
  • Linux Snort检测
  • 工商银行devops流程一体化工具
  • uniapp结合movable-area与movable-view实现拖拽功能2
  • Hbuilder ios 离线打包sdk版本4.36,HbuilderX 4.36生成打包资源 问题记录
  • wireshark排除私接小路由
  • MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发
  • 【MFC】设置CTreeCtrl单个节点的文字颜色
  • Jenkins git SSH获取code报错:git@github.com: Permission denied (publickey).
  • 计算机网络 (33)传输控制协议TCP概述
  • 【HTML+CSS+JS+VUE】web前端教程-18-css引入方式
  • 2025年第三届“华数杯”国际赛B题解题思路与代码(Matlab版)
  • 网络安全测评技术与标准