JavaScript Array(数组)
Array(数组)用来存放一组有序数据:一组商品、一页评论、一次查询的多行结果……几乎所有"多条数据"都要装进数组。数组可以混装任意类型,长度还能动态伸缩,配合 push、map、filter 等方法,比传统语言的数组灵活得多。
创建数组
最常用的是方括号字面量,也可以 new Array(n) 预占长度(注意只传一个数字参数表示"长度",不是放进元素 3),或用 Array.of、Array.from 做转换:
let fruits = ["苹果", "香蕉", "橘子"]; // 字面量,推荐
let mixed = [1, "a", true, null]; // 可以混装不同类型
let nums = Array.of(1, 2, 3); // 输出:[ 1, 2, 3 ]
let fromStr = Array.from("abc"); // 输出:[ 'a', 'b', 'c' ]
console.log(mixed[0]); // 输出:1,下标从 0 开始
console.log(fruits.length); // 输出:3,length 是属性不是方法
增删元素:push / pop / shift / unshift
四个方法在数组两端做增删,都会直接修改原数组;push/pop 组合就是"栈",shift/push 组合就是"队列":
let arr = ["b"];
arr.push("c"); // 尾部追加
arr.unshift("a"); // 头部插入
console.log(arr); // 输出:[ 'a', 'b', 'c' ]
arr.pop(); // 删除尾部元素
arr.shift(); // 删除头部元素
console.log(arr); // 输出:[ 'b' ]
查找与截取:indexOf / includes / slice / splice
slice 不修改原数组,splice 会删除/插入并修改原数组,二者要分清:
let arr = ["a", "b", "c", "d"];
console.log(arr.indexOf("c")); // 输出:2
console.log(arr.indexOf("x")); // 输出:-1,找不到
console.log(arr.includes("b")); // 输出:true
console.log(arr.slice(1, 3)); // 输出:[ 'b', 'c' ],截取 1~2 号
console.log(arr); // 输出:[ 'a', 'b', 'c', 'd' ],slice 不改原数组
arr.splice(1, 2); // 从下标 1 删 2 个
console.log(arr); // 输出:[ 'a', 'd' ]
arr.splice(1, 0, "x"); // 在下标 1 处插入(删 0 个)
console.log(arr); // 输出:[ 'a', 'x', 'd' ]
排序与反转:sort / reverse
sort 默认按"字符串"排序,排数字必须传比较函数,否则会出现 10 < 9 的笑话;比较函数返回负数表示 a 在前、正数表示 b 在前:
let nums = [3, 10, 1, 20];
console.log(nums.sort()); // 输出:[ 1, 10, 20, 3 ],按字符串排的坑
console.log(nums.sort((a, b) => a - b)); // 输出:[ 1, 3, 10, 20 ],升序
console.log(nums.sort((a, b) => b - a)); // 输出:[ 20, 10, 3, 1 ],降序
console.log([1, 2, 3].reverse()); // 输出:[ 3, 2, 1 ]
遍历与加工:forEach / map / filter / reduce
forEach 遍历、map 映射出新数组、filter 过滤、reduce 汇总,是数组方法的核心;它们都不改原数组并返回新结果,链条写法 arr.filter(...).map(...) 在数据清洗里很常用:
let prices = [10, 25, 8, 60];
let tax = prices.map(p => p * 1.1); // 每个元素加 10% 税
console.log(tax); // 输出:[ 11, 27.5, 8.8, 66 ]
let cheap = prices.filter(p => p < 30); // 只留小于 30 的
console.log(cheap); // 输出:[ 10, 25, 8 ]
let total = prices.reduce((sum, p) => sum + p, 0); // 全部求和
console.log(total); // 输出:103
prices.forEach((p, i) => console.log(i + ":" + p)); // 输出:0:10 1:25 2:8 3:60
多维数组与类型判断
数组的元素可以是数组,形成表格;typeof 对数组返回 "object",判断数组请用 Array.isArray:
let table = [
["张三", 90],
["李四", 85],
];
console.log(table[1][0]); // 输出:李四,先取行再取列
console.log(typeof table); // 输出:object
console.log(Array.isArray(table)); // 输出:true,这才是正确判断
let arr = [1, 2];
console.log([...arr, 3, 4]); // 输出:[ 1, 2, 3, 4 ],展开运算符拼接
小结:用字面量创建数组,push/pop/shift/unshift 在两端增删;slice 取值不改原数组、splice 直接改;sort 排数字要传比较函数;最实用的是 map/filter/reduce 三件套,配合展开运算符与 Array.isArray,日常数据操作基本够用。