数组
数组用于在单一变量中存储多个值。
定义
- 数组是一种特殊的变量,它能够一次存放一个以上的值。
- 通过引用索引号来访问这些值。
- 通过引用**索引号(下标号)**来引用某个数组元素。
- 数组的索引【0,n-1】
- 根据索引修改数组的值
- 通过数组名访问整个数组
- 数组是一种特殊类型的对象
- 数组元素也可以是对象(对象数组)
- 可以在数组保存对象
- 可以在数组中保存函数
- 可以在数组中保存数组:
- JavaScript不支持hash表
创建数组
- 空格和折行并不重要。声明可横跨多行:
- 请不要最后一个元素之后写逗号
- 也可以使用new创建(不推荐)
var array-name = [item1, item2, ...];
数组的属性
length
属性返回数组的长度(数组元素的数目)。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length; // fruits 的长度是 4
访问数组第一个元素:arr[0]
访问数组最后一个元素:arr[arr.length-1]
数组的方法
遍历方法
Array.foreach(function)
使用foreach方法可以遍历数组
连接方法
toString()
toString()
把数组转换为数组值**(逗号分隔)**的字符串。
join(String)
join()
方法也可将所有数组元素结合为一个字符串。- 它的行为类似 toString(),但是您还可以规定分隔符:
样例1
let arr = [1, 2, 3, "hello", "world", 6, 5, 4, 8, 9];
//获取数组长度
let len = arr.length;
//用,隔开
let str = arr.toString();
//自定义隔开符号
str = arr.join(" ");
删除方法
pop()
pop()
方法从数组中删除最后一个元素:pop()
方法返回“被弹出”的值:
shift()
shift()
方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。
shift()
方法返回被“位移出”的元素:
splice(index,length,items…)
- 能够使用
splice()
在数组中不留“空洞”的情况下移除元素: - 第一个参数定义新元素应该被添加(接入)的位置。
- 第二个参数定义应该删除多个元素。
- 设置第一个参数为需要删除的位置,第二个参数为删除的数量,即可实现无洞删除
delete
元素就可以使用 JavaScript delete
运算符来删除:
使用 delete
会在数组留下未定义的空洞。请使用 pop()
或 shift()
取而代之
样例2
//删除元素
//delete 会出现元素空洞,舍弃
delete arr[0];
//pop删除最后一个元素,不会产生空洞
arr.pop();
//shift删除第一个元素,不会产生空洞
arr.shift();
//使用splice删除任意位置的元素
arr.splice(5, 1);
添加方法
push(item)
push()
方法(在数组结尾处)向数组添加一个新的元素:push()
方法返回新数组的长度
unshift()
unshift()
方法(在开头)向数组添加新元素,并“反向位移”旧元素:unshift()
方法返回新数组的长度。
样例3
//添加方法
//在末尾添加
arr.push(15);
arr[arr.length] = 15;
//在首部添加
arr.unshift(15);
//在任意位置添加
arr.splice(5, 0, 5)
连接方法
concat(items…)
concat()
方法通过合并(连接)现有数组来创建一个新数组:concat()
方法不会更改现有数组。它总是返回一个新数组。concat()
方法可以使用任意数量的数组参数:
裁剪方法
slice()
slice()
方法用数组的某个片段切出新数组。slice()
方法创建新数组。它不会从源数组中删除任何元素。slice()
可接受两个参数,比如 (1, 3)。该方法会从开始参数选取元素,直到结束参数(不包括)为止。
判断是否为数组
-
Array.isArray()如果是数组则返回TRUE,否则FALSE
-
function isArray(x) { return x.constructor.toString().indexOf("Array") > -1; }
-
var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits instanceof Array // 返回 true
数组排序
sort()
sort()
方法以字母顺序对数组进行排序
reverse()
reverse()
方法反转数组中的元素
可以使用它以降序对数组进行排序:(先排序,在反转)
数字排序
-
默认地,
sort()
函数按照字符串顺序对值进行排序。 -
该函数很适合字符串(“Apple” 会排在 “Banana” 之前)。
-
不过,如果数字按照字符串来排序,则 “25” 大于 “100”,因为 “2” 大于 “1”。
-
正因如此,
sort()
方法在对数值排序时会产生不正确的结果。 -
通过一个比值函数来修正此问题:
-
//升序排列 var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return a - b}); //降序排列 var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return b - a});
比值函数
-
比较函数的目的是定义另一种排序顺序。
-
比较函数应该返回一个负,零或正值(小于、等于、大于),这取决于参数:
-
function(a, b){return a-b}
-
当
sort()
函数比较两个值时,会将值发送到比值函数,并根据所返回的值(负、零或正值)对这些值进行排序。
最大最小值
对数组使用 Math.min()
使用 Math.min.apply
来查找数组中的最低值:
对数组使用 Math.max()
您可以使用 Math.max.apply
来查找数组中的最高值:
function myArrayMax(arr) {
return Math.max.apply(null, arr);
}
排序对象数组
-
即使对象拥有不同数据类型的属性,
sort()
方法仍可用于对数组进行排序。 -
解决方法是通过比较函数来对比属性值:
-
//对象数组 let person = [ { id: 1005, name: "zhangsan" }, { id: 1003, name: "lishi" }, { id: 1004, name: "wangwu" }, { id: 1006, name: "heming" }, ]; //根据ID排序 person.sort((p1, p2) => { return p1.id - p2.id; });
-
比较字符串属性会稍复杂:
-
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; });
数组遍历
Array.forEach(function)
-
forEach()
方法为每个数组元素调用一次函数(回调函数) -
该函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
var txt = ""; var numbers = [45, 4, 9, 16, 25]; numbers.forEach(myFunction); function myFunction(value, index, array) { txt = txt + value + "<br>"; }
Array.map(function)
-
map()
方法通过对每个数组元素执行函数来创建新数组。 -
map()
方法不会对没有值的数组元素执行函数。 -
map()
方法不会更改原始数组。 -
该函数有 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
var numbers1 = [45, 4, 9, 16, 25]; var numbers2 = numbers1.map(myFunction); function myFunction(value, index, array) { return value * 2; }
Array.filter(function)
-
filter()
方法创建一个包含通过测试的数组元素的新数组。 -
此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
let person = [ { id: 1005, name: "zhangsan" }, { id: 1003, name: "lishi" }, { id: 1004, name: "wangwu" }, { id: 1006, name: "heming" }, ]; //过滤器,返回满足条件的对象 let newPerson = person.filter((value) => { return value.id > 1002 && value.id < 1005; }); //res=[ { id: 1003, name: 'lishi' }, { id: 1004, name: 'wangwu' } ]
Array.reduce(function)
-
reduce()
方法在每个数组元素上运行函数,以生成(减少它)单个值。 -
reduce()
方法在数组中从左到右工作。另请参阅 reduceRight()。 -
reduce()
方法不会减少原始数组。 -
此函数接受 4 个参数:
- 总数(初始值/先前返回的值)
- 项目值
- 项目索引
- 数组本身
-
reduce()
方法能够接受一个初始值: -
var numbers1 = [45, 4, 9, 16, 25]; var sum = numbers1.reduce(myFunction); function myFunction(total, value, index, array) { return total + value; }
Array.reduceRight(function)
-
reduceRight()
方法在每个数组元素上运行函数,以生成(减少它)单个值。 -
reduceRight()
方法在数组中从右到左工作。另请参阅 reduce()。 -
reduceRight()
方法不会减少原始数组。 -
此函数接受 4 个参数:
- 总数(初始值/先前返回的值)
- 项目值
- 项目索引
- 数组本身
-
var numbers1 = [45, 4, 9, 16, 25]; var sum = numbers1.reduceRight(myFunction); function myFunction(total, value, index, array) { return total + value; }
Array.every(function)
-
every()
方法检查所有元素是否通过测试。 -
返回true(全部满足)或false(其余)
-
此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
let arr = [1, 5, 4, 3, 2, 6]; //判断是否每个元素都满足条件 let every = arr.every((value) => { return value > 2; }); console.log(every);//false every = arr.every((value) => { return value > 0; }); console.log(every);//true
Array.some(function)
-
some()
方法检查某些数组值是否通过了测试。 -
返回true(有一个满足)或者false(全部不满足)
-
此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
let arr = [1, 5, 4, 3, 2, 6]; //判断是否有元素满足条件 let some = arr.some((value) => { return value > 6; }); console.log(some);
Array.indexOf(item)
-
indexOf()
方法在数组中搜索元素值并返回其位置。 -
有两个参数
- item(项目值)
- start(其实位置)
-
如果未找到项目,
Array.indexOf()
返回 -1。 -
如果项目多次出现,则返回第一次出现的位置。
-
var fruits = ["Apple", "Orange", "Apple", "Mango"]; var a = fruits.indexOf("Apple");
Array.lastIndexOf(item)
Array.lastIndexOf()
与 Array.indexOf()
类似,但是从数组结尾开始搜索。
Array.find(function)
-
find()
方法返回通过测试函数的第一个数组元素的值。 -
此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
let person = [ { id: 1005, name: "zhangsan" }, { id: 1003, name: "lishi" }, { id: 1004, name: "wangwu" }, { id: 1006, name: "heming" }, ]; //寻找第一个满足条件的元素 let first = person.find((value) => { return value.name.indexOf("an") != -1; });
Array.findIndex(function)
-
findIndex()
方法返回通过测试函数的第一个数组元素的索引。 -
此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
-
var numbers = [4, 9, 16, 25, 29]; var first = numbers.findIndex(myFunction); function myFunction(value, index, array) { return value > 18; }
数组 const
无法重新赋值
用 const
声明的数组不能重新赋值:
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // ERROR
但是数组的元素是可以修改的
// 您可以创建常量数组:
const cars = ["Saab", "Volvo", "BMW"];
// 您可以更改元素:
cars[0] = "Toyota";
// 您可以添加元素:
cars.push("Audi");
声明时赋值
JavaScript const
变量在声明时必须赋值:
意思是:用 const
声明的数组必须在声明时进行初始化。
使用 const
而不初始化数组是一个语法错误:(不初始化不起作用)