数组方法
toString()
把数组转换为字符串,JavaScript 方法 把数组转换为数组值(逗号分隔)的字符串。
join()
方法也可将所有数组元素结合为一个字符串。
它的行为类似 toString(),但是您还可以规定分隔符:
pop()
方法从数组中删除最后一个元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.pop(); // 从 fruits 删除最后一个元素("Mango")pop() 方法返回“被弹出”的值:var fruits = ["Banana", "Orange", "Apple", "Mango"];var x = fruits.pop(); // x 的值是 "Mango"
push()
方法(在数组结尾处)向数组添加一个新的元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.push("Kiwi"); // 向 fruits 添加一个新元素push() 方法返回新数组的长度:var fruits = ["Banana", "Orange", "Apple", "Mango"];var x = fruits.push("Kiwi"); // x 的值是 5
shift()
方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.shift(); // 从 fruits 删除第一个元素 "Banana"shift() 方法返回被“位移出”的字符串:var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.shift(); // 返回 "Banana"
unshift()
方法(在开头)向数组添加新元素,并“反向位移”旧元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.unshift("Lemon"); // 向 fruits 添加新元素 "Lemon"unshift() 方法返回新数组的长度。var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.unshift("Lemon"); // 返回 5
splice()
拼接数组,可用于向数组添加新项:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.splice(2, 0, "Lemon", "Kiwi");第一个参数(2)定义了应添加新元素的位置(拼接)。第二个参数(0)定义应删除多少元素。其余参数(“Lemon”,“Kiwi”)定义要添加的新元素。splice() 方法返回一个包含已删除项的数组:var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.splice(2, 2, "Lemon", "Kiwi");
使用 splice() 来删除元素
通过聪明的参数设定,您能够使用 splice() 在数组中不留“空洞”的情况下移除元素:var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.splice(0, 1); // 删除 fruits 中的第一个元素第一个参数(0)定义新元素应该被添加(接入)的位置。第二个参数(1)定义应该删除多个元素。其余参数被省略。没有新元素将被添加。
concat()
合并(连接)数组方法通过合并(连接)现有数组来创建一个新数组:
var myGirls = ["Cecilie", "Lone"];var myBoys = ["Emil", "Tobias", "Linus"];var myChildren = myGirls.concat(myBoys); // 连接 myGirls 和 myBoysconcat() 方法不会更改现有数组。它总是返回一个新数组。concat() 方法可以使用任意数量的数组参数:实例(合并三个数组)var arr1 = ["Cecilie", "Lone"];var arr2 = ["Emil", "Tobias", "Linus"];var arr3 = ["Robin", "Morgan"];var myChildren = arr1.concat(arr2, arr3); // 将arr1、arr2 与 arr3 连接在一起concat() 方法也可以将值作为参数:实例(将数组与值合并)var arr1 = ["Cecilie", "Lone"];var myChildren = arr1.concat(["Emil", "Tobias", "Linus"]);
裁剪数组
slice() 方法用数组的某个片段切出新数组。
本例从数组元素 1 ("Orange")开始切出一段数组:var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];var citrus = fruits.slice(1);slice() 方法创建新数组。它不会从源数组中删除任何元素。本例从数组元素 3 ("Apple")开始切出一段数组:var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];var citrus = fruits.slice(3);slice() 可接受两个参数,比如 (1, 3)。该方法会从开始参数选取元素,直到结束参数(不包括)为止。var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];var citrus = fruits.slice(1, 3);如果结束参数被省略,比如第一个例子,则 slice() 会切出数组的剩余部分。var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];var citrus = fruits.slice(2);
数组排序
sort()
sort() 方法以字母顺序对数组进行排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.sort(); // 对 fruits 中的元素进行排序//Apple,Banana,Mango,Orange
sort() 方法对数组进行排序:
升序排序var arr = [1,3,524,5,21,611,-2]console.log(arr.sort((a,b)=>{return a-b}))// [-2, 1, 3, 5, 21, 524, 611]降序排序var arr = [1,3,524,5,21,611,-2]console.log(arr.sort((a,b)=>{return b-a}))以随机顺序排序数组var points = [40, 100, 1, 5, 25, 10];points.sort(function(a, b){return 0.5 - Math.random()});查找最高(或最低)的数组值JavaScript 不提供查找数组中最大或最小数组值的内建函数。不过,在对数组进行排序之后,您能够使用索引来获得最高或最低值。var points = [40, 100, 1, 5, 25, 10];points.sort(function(a, b){return a - b});// 现在 points[0] 包含最低值// 而 points[points.length-1] 包含最高值
如果您仅仅需要找到最高或最低值,对整个数组进行排序是效率极低的方法。
对数组使用 Math.max()
可以使用 Math.max.apply 来查找数组中的最高值:
function myArrayMax(arr) {return Math.max.apply(null, arr);}Math.max.apply([1, 2, 3]) 等于 Math.max(1, 2, 3)。var a = [1,3,524,5,21,611,-2]console.log(Math.max.apply(null,a))//611
对数组使用 Math.min()
您可以使用 Math.min.apply 来查找数组中的最低值:
function myArrayMin(arr) {return Math.min.apply(null, arr);}Math.min.apply([1, 2, 3]) 等于 Math.min(1, 2, 3)。var a = [1,3,524,5,21,611,-2]console.log(Math.min.apply(null,a))//-2
排序对象数组
JavaScript 数组经常会包含对象:
var cars = [{type:"Volvo", year:2016},{type:"Saab", year:2001},{type:"BMW", year:2010}];即使对象拥有不同数据类型的属性,sort() 方法仍可用于对数组进行排序。解决方法是通过比较函数来对比属性值:cars.sort(function(a, b){return a.year - b.year});比较字符串属性会稍复杂:cars.sort(function(a, b){var x = a.type.toLowerCase();var y = b.type.toLowerCase();if (x < y) {return -1;}if (x > y) {return 1;}return 0;});
reverse()
反转数组方法反转数组中的元素。使用它以降序对数组进行排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits.sort(); // 对 fruits 中的元素进行排序fruits.reverse(); // 反转元素顺序
数组迭代方法
array
Array.forEach()
forEach() 方法为每个数组元素调用一次函数(回调函数)。
语法:array.forEach(function(currentValue, index, arr), thisValue)
| 参数 | 描述 | ||
|---|---|---|---|
| function(currentValue, index, arr) | 必需。 数组中每个元素需要调用的函数。 函数参数: |
参数 | 描述 |
| :—- | :—- | ||
| currentValue | 必需。当前元素 | ||
| index | 可选。当前元素的索引值。 | ||
| arr | 可选。当前元素所属的数组对象。 |
|
| thisValue | 可选。传递给函数的值一般用 “this” 值。
如果这个参数为空, “undefined” 会传递给 “this” 值 |
var txt = "";var numbers = [45, 4, 9, 16, 25];numbers.forEach(myFunction);function myFunction(value, index, array) {txt = txt + value + "<br>";}注释:该函数接受 3 个参数:• 项目值• 项目索引• 数组本身上面的例子只用了 value 参数。这个例子可以重新写为:var txt = "";var numbers = [45, 4, 9, 16, 25];numbers.forEach(myFunction);function myFunction(value) {txt = txt + value + "<br>";}所有浏览器都支持 Array.forEach(),除了 Internet Explorer 8 或更早的版本:var database = {users: ["张法法", "法法师", "嘎嘎"],sendEmail: function (user) {if (this.isValidUser(user)) {console.log("你好," +user);} else {console.log("抱歉," + user +",你不是本家人");}},isValidUser: function (user) {return /^张/.test(user);}};// 给每个人法邮件database.users.forEach( // database.users中人遍历database.sendEmail, // 发送邮件database// 使用database代替上面标红的this);
Array.map()
语法:array.map(function(currentValue,index,arr), thisValue)
map() 方法通过对每个数组元素执行函数来创建新数组。
map() 方法不会对没有值的数组元素执行函数。
map() 方法不会更改原始数组。
这个例子将每个数组值乘以2:
| 参数 | 描述 | ||
|---|---|---|---|
| function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数: |
参数 | 描述 |
| :—- | :—- | ||
| currentValue | 必须。当前元素的值 | ||
| index | 可选。当前元素的索引值 | ||
| arr | 可选。当前元素属于的数组对象 |
|
| thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。
如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。 |
var numbers1 = [45, 4, 9, 16, 25];var numbers2 = numbers1.map(myFunction);function myFunction(value, index, array) {return value * 2;}
请注意,该函数有 3 个参数:
- 项目值
- 项目索引
- 数组本身
当回调函数仅使用 value 参数时,可以省略索引和数组参数:
var numbers1 = [45, 4, 9, 16, 25];var numbers2 = numbers1.map(myFunction);function myFunction(value) {return value * 2;}所有浏览器都支持 Array.map(),除了 Internet Explorer 8 或更早的版本
关联数组
很多编程元素支持命名索引的数组。
具有命名索引的数组被称为关联数组(或散列)。
JavaScript 不支持命名索引的数组。
在 JavaScript 中,数组只能使用数字索引。
var person = [];person[0] = "Bill";person[1] = "Gates";person[2] = 62;var x = person.length; // person.length 返回 3var y = person[0]; // person[0] 返回 "Bill"警告!假如使用命名索引,JavaScript 会把数组重定义为标准对象。之后,所有数组的方法和属性将产生非正确结果。var person = [];person["firstName"] = "Bill";person["lastName"] = "Gates";person["age"] = 62;var x = person.length; // person.length 将返回 0var y = person[0]; // person[0] 将返回 undefined
避免 new Array()
没有必要使用 JavaScript 的内建数组构造器 new Array()。
请使用 [] 取而代之!
new 关键词只会使代码复杂化。它还会产生某些不可预期的结果:
var points = new Array(40, 100); // 创建包含两个元素的数组(40 和 100)假如删除其中一个元素会怎么样?var points = new Array(40); // 创建包含 40 个未定义元素的数组!!!
识别数组
常见的问题是:我如何知晓某个变量是否是数组?问题在于 JavaScript 运算符 typeof 返回 “object”:
var fruits = ["Banana", "Orange", "Apple", "Mango"];typeof fruits; // 返回 objecttypeof 运算符返回 "object",因为 JavaScript 数组属于对象。解决方案 1:为了解决这个问题,ECMAScript 5 定义了新方法 Array.isArray():Array.isArray(fruits); // 返回 true此方案的问题在于 ECMAScript 5 不支持老的浏览器。解决方案 2:创建 isArray() 函数以解决此问题:function isArray(x) {return x.constructor.toString().indexOf("Array") > -1;}假如参数为数组,则上面的函数始终返回 true。或者更准确的解释是:假如对象原型包含单词 "Array" 则返回 true。解决方案 3:假如对象由给定的构造器创建,则 instanceof 运算符返回 true:var fruits = ["Banana", "Orange", "Apple", "Mango"];fruits instanceof Array // 返回 true
