JavaScript学习手册(八)

数组

数组用于在单一变量中存储多个值。

定义
  • 数组是一种特殊的变量,它能够一次存放一个以上的值。
  • 通过引用索引号来访问这些值。
  • 通过引用**索引号(下标号)**来引用某个数组元素。
  • 数组的索引【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 而不初始化数组是一个语法错误:(不初始化不起作用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值