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,日常数据操作基本够用。

笔记加载中…