数组:编程世界里的变形金刚,你的得力助手
各位码农、准码农,以及对编程跃跃欲试的朋友们,今天咱们聊聊编程世界里一个超级重要,但又容易被忽视的角色——数组(Array)。
数组这玩意儿,就像咱们厨房里的百宝箱,什么葱姜蒜、锅碗瓢盆都能往里塞。在编程世界里,它能把各种各样的数据,像数字、文字、甚至是更复杂的数据结构,整整齐齐地码放在一起。
别看它貌似简单,但数组绝对是编程世界里的“变形金刚”,能屈能伸,变化万千。掌握了它,你的编程技能就能提升一个档次,写代码就像炒菜一样,得心应手,滋味十足。
一、数组的“七十二变”:常用方法大盘点
数组之所以被称为“变形金刚”,很大程度上是因为它拥有各种各样的“技能”,也就是我们常说的“方法”。这些方法就像各种不同的工具,能帮你轻松地操作数组里的数据。
-
增:给数组添砖加瓦
-
push()
:尾部添加,简单粗暴想象一下,你正在玩乐高,突然想在你的积木城堡后面再加一块砖,
push()
方法就相当于这个动作。它会把新的元素添加到数组的末尾,让数组变得更长。let fruits = ["apple", "banana"]; fruits.push("orange"); // fruits 现在是 ["apple", "banana", "orange"]
-
unshift()
:头部添加,有点“插队”的意思如果你想把新的元素添加到数组的最前面,
unshift()
方法就能帮你实现。但这就像在排队的时候插队一样,会把后面的元素都往后挪一位。let fruits = ["apple", "banana"]; fruits.unshift("mango"); // fruits 现在是 ["mango", "apple", "banana"]
-
-
删:给数组瘦身减肥
-
pop()
:尾部移除,简单干脆pop()
方法就像吃零食一样,一次吃掉数组末尾的一个元素。它会直接修改数组,并返回被移除的元素。let fruits = ["apple", "banana", "orange"]; let lastFruit = fruits.pop(); // lastFruit 是 "orange",fruits 现在是 ["apple", "banana"]
-
shift()
:头部移除,有点“卸磨杀驴”的味道shift()
方法会移除数组的第一个元素,并返回被移除的元素。这就像古代卸磨杀驴一样,用完就扔。let fruits = ["apple", "banana"]; let firstFruit = fruits.shift(); // firstFruit 是 "apple",fruits 现在是 ["banana"]
-
splice()
:指定位置,想删多少删多少splice()
方法是最强大的删除工具,它可以从数组的任意位置删除任意数量的元素。它接受两个参数:起始位置和删除的元素个数。let fruits = ["apple", "banana", "orange", "grape"]; fruits.splice(1, 2); // 从索引 1 开始删除 2 个元素,fruits 现在是 ["apple", "grape"]
-
-
改:给数组换个造型
-
直接赋值:简单粗暴,直接替换
修改数组元素最简单的方法就是直接通过索引赋值。
let fruits = ["apple", "banana"]; fruits[0] = "mango"; // fruits 现在是 ["mango", "banana"]
-
splice()
:万能方法,增删改一体splice()
方法不仅可以删除元素,还可以添加元素,实现数组的修改。只需要在删除元素的基础上,添加要插入的元素即可。let fruits = ["apple", "banana", "orange"]; fruits.splice(1, 1, "mango", "kiwi"); // 从索引 1 开始删除 1 个元素,并插入 "mango" 和 "kiwi",fruits 现在是 ["apple", "mango", "kiwi", "orange"]
-
-
查:在数组里寻宝
-
indexOf()
:查找元素的索引,找到就告诉你位置indexOf()
方法可以查找指定元素在数组中的索引。如果找到了,就返回元素的索引;如果没找到,就返回 -1。let fruits = ["apple", "banana", "orange"]; let index = fruits.indexOf("banana"); // index 是 1 let notFound = fruits.indexOf("grape"); // notFound 是 -1
-
includes()
:判断元素是否存在,是或否,一锤定音includes()
方法可以判断数组是否包含指定的元素,返回 true 或 false。let fruits = ["apple", "banana", "orange"]; let hasBanana = fruits.includes("banana"); // hasBanana 是 true let hasGrape = fruits.includes("grape"); // hasGrape 是 false
-
-
其他常用方法:数组的“秘密武器”
-
slice()
:切割数组,生成新的“副本”slice()
方法可以从数组中提取一部分元素,生成一个新的数组,不会修改原数组。它接受两个参数:起始位置和结束位置(不包含结束位置的元素)。let fruits = ["apple", "banana", "orange", "grape"]; let newFruits = fruits.slice(1, 3); // newFruits 是 ["banana", "orange"],fruits 保持不变
-
concat()
:连接数组,强强联合concat()
方法可以将两个或多个数组连接成一个新的数组,不会修改原数组。let fruits1 = ["apple", "banana"]; let fruits2 = ["orange", "grape"]; let allFruits = fruits1.concat(fruits2); // allFruits 是 ["apple", "banana", "orange", "grape"]
-
join()
:把数组变成字符串,用指定符号连接join()
方法可以将数组的所有元素连接成一个字符串,可以使用指定的分隔符。let fruits = ["apple", "banana", "orange"]; let fruitString = fruits.join(", "); // fruitString 是 "apple, banana, orange"
-
reverse()
:颠倒数组,乾坤倒转reverse()
方法可以将数组的元素顺序颠倒过来,直接修改原数组。let fruits = ["apple", "banana", "orange"]; fruits.reverse(); // fruits 现在是 ["orange", "banana", "apple"]
-
sort()
:排序数组,从小到大,从大到小,随你喜欢sort()
方法可以对数组的元素进行排序,默认是按照字符串的 Unicode 码点进行排序。如果需要按照数字大小排序,需要传入一个比较函数。let numbers = [3, 1, 4, 1, 5, 9, 2, 6]; numbers.sort(); // numbers 现在是 [1, 1, 2, 3, 4, 5, 6, 9] numbers.sort((a, b) => a - b); // 按照数字大小升序排序,numbers 现在是 [1, 1, 2, 3, 4, 5, 6, 9] numbers.sort((a, b) => b - a); // 按照数字大小降序排序,numbers 现在是 [9, 6, 5, 4, 3, 2, 1, 1]
-
二、数组的“葵花宝典”:遍历数组的各种姿势
掌握了数组的方法,只是万里长征的第一步。更重要的是,我们要学会如何遍历数组,也就是把数组里的每一个元素都访问一遍。这就像你要把一个箱子里的所有东西都拿出来看看一样。
-
for
循环:最经典的遍历方式,灵活可控for
循环是最传统的遍历数组的方式,也是最灵活的方式。你可以完全控制循环的起始位置、结束条件和步长。let fruits = ["apple", "banana", "orange"]; for (let i = 0; i < fruits.length; i++) { console.log(fruits[i]); // 依次输出 "apple", "banana", "orange" }
-
for...of
循环:简洁明了,专注于元素本身for...of
循环是 ES6 引入的一种新的遍历方式,它更加简洁明了,可以直接访问数组的元素,而不需要关心索引。let fruits = ["apple", "banana", "orange"]; for (let fruit of fruits) { console.log(fruit); // 依次输出 "apple", "banana", "orange" }
-
forEach()
方法:优雅简洁,函数式编程的体现forEach()
方法是数组自带的一个方法,它接受一个函数作为参数,该函数会被依次应用到数组的每一个元素上。let fruits = ["apple", "banana", "orange"]; fruits.forEach(fruit => { console.log(fruit); // 依次输出 "apple", "banana", "orange" });
三、数组的“高级玩法”:高阶函数的运用
如果说前面的方法和遍历只是数组的基本功,那么高阶函数就是数组的“高级玩法”。高阶函数是指接受一个或多个函数作为参数,或者返回一个函数的函数。通过高阶函数,我们可以对数组进行更加复杂的操作,实现更加强大的功能。
-
map()
:映射数组,生成新的“投影”map()
方法可以将数组的每一个元素都应用一个函数,然后返回一个新的数组,新数组的元素是原数组元素经过函数处理后的结果。这就像给数组里的每个元素都拍一张照片,然后把这些照片组成一个新的相册。let numbers = [1, 2, 3, 4, 5]; let squares = numbers.map(number => number * number); // squares 是 [1, 4, 9, 16, 25]
-
filter()
:过滤数组,留下“精英”filter()
方法可以根据指定的条件过滤数组的元素,返回一个新的数组,新数组只包含满足条件的元素。这就像从一群人中筛选出符合特定条件的人,比如身高超过 1 米 8 的人。let numbers = [1, 2, 3, 4, 5, 6]; let evenNumbers = numbers.filter(number => number % 2 === 0); // evenNumbers 是 [2, 4, 6]
-
reduce()
:归并数组,化零为整reduce()
方法可以将数组的所有元素归并成一个值。它接受两个参数:一个归并函数和一个初始值。归并函数接受两个参数:上一次归并的结果和当前元素。这就像把一堆零散的物品打包成一个包裹。let numbers = [1, 2, 3, 4, 5]; let sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // sum 是 15
四、数组的“实战演练”:几个生动的例子
光说不练假把式,接下来我们用几个生动的例子来展示数组的强大功能。
-
统计文章中单词出现的次数
function wordCount(text) { let words = text.toLowerCase().split(/s+/); // 将文章转换为小写,并按空格分割成单词数组 let counts = {}; // 用一个对象来存储单词和出现的次数 words.forEach(word => { counts[word] = (counts[word] || 0) + 1; // 统计单词出现的次数 }); return counts; } let text = "This is a sample text. This text is for demonstrating word count."; let wordCounts = wordCount(text); console.log(wordCounts); // 输出 { this: 2, is: 2, a: 1, sample: 1, text: 2, for: 1, demonstrating: 1, word: 1, count: 1 }
-
从学生列表中找出成绩及格的学生
let students = [ { name: "Alice", score: 75 }, { name: "Bob", score: 55 }, { name: "Charlie", score: 90 }, { name: "David", score: 45 } ]; let passingStudents = students.filter(student => student.score >= 60); // 过滤出成绩及格的学生 console.log(passingStudents); // 输出 [ { name: 'Alice', score: 75 }, { name: 'Charlie', score: 90 } ]
-
计算购物车中商品的总价
let cart = [ { name: "Apple", price: 1.5, quantity: 3 }, { name: "Banana", price: 0.75, quantity: 5 }, { name: "Orange", price: 1.0, quantity: 2 } ]; let totalPrice = cart.reduce((accumulator, item) => accumulator + item.price * item.quantity, 0); // 计算商品的总价 console.log(totalPrice); // 输出 11.25
五、总结:掌握数组,编程之路更宽广
数组是编程世界里一个非常重要的工具,掌握了它,你的编程技能就能提升一个档次。希望通过本文的介绍,你对数组有了更深入的了解,能够在实际编程中灵活运用数组的各种方法,编写出更加高效、简洁的代码。
记住,数组就像咱们厨房里的百宝箱,只要你善于挖掘,就能发现它无穷的潜力。祝你在编程的道路上越走越远,写出更多精彩的代码!