首页 > 编程语言 >03-JavaScript数组

03-JavaScript数组

时间:2024-03-28 11:29:30浏览次数:29  
标签:03 arr 元素 console log JavaScript 数组 var

1. 数组(重点)

思考:如何保存一个班级的所有学生的姓名? 回答:一种方法利用前面学习过的知识,则每一条信息都需要一个变量去保存,缺点是这样做很麻烦,而且容易出错,又不合理;另一种方法就是利用数组。 概念:数组是存储一系列值的变量集合,可以存储多个值。

1.1 语法

数组构成:数组由一个或多个数组元素组成的,各元素之间使用逗号“,”分割。 数组元素:每个数组元素由“索引下标”和“值”构成。

索引下标:简称下标,以数字表示,默认从0开始依次递增,用于识别元素。 值:元素的内容,可以是任意类型的数据,如数值型、字符型、数组、对象等。

1.2 创建数组

两种方式创建数组:直接使用“[]”的方式和实例化Array对象的方式

使用数组直接量是创建数组最简单、最直观的方法,在方括号中将数组元素用逗号隔开即可

例如:

var empty = []; // 没有元素的空数组
​
var num = [1, 3, 5, 7, 9]; // 有 5 个数值的数组
​
var mix = ['Bob', 20, true]; // 3 种不同元素的数组
​

调用构造函数 Array() 是创建数组的另一种方法。

// 元素值类型为字符串
var area = new Array('Beijing', 'Shanghai', 'Shenzhen');
// 元素值类型为数值型
var score = new Array(56, 68, 98, 44);
// 元素值类型为混合型
var mix = new Array(123, 'abc', null, true, undefined);
// 空数组
var arr1 = new Array();   或    var arr2 = new Array; //等同于数组直接量 [ ]
// 指定长度的数组
var len = new Array(5); //这种方式用来创建指定长度的数组。当预先知道所需元素个数时,这种方式可以用来预先分配一个数组空间。注意,数组中没有存储值,不能认为它是包含 5个值为 undefined 元素的数组
//含有3个空储存位置
var emptyPlace1 = ['abc', , , ,'123']; 
//会报语法错误
var emptyPlace2 = new Array(56, 68, , , ,98);

注意:

1.在创建数组时,最后一个元素后的逗号可以省略,也可以存在。 2.直接法“[]”与Array()对象在创建数组时的区别在于,前者可以创建含有空存储位置的数组,而后者不可以。

1.3 访问和修改数组元素

数组创建完成后,我们可以 [ ] 操作符访问数组中的元素,数组的引用位于方括号左边。 方括号中是一个返回非负整数的任意表达式。使用该语法即可以访问数组中的元素,又可以修改数组中的元素。

var letters = ['a', 'b', 'c', 'd'];
​
console.log(letters[0]); // 访问索引为 0 的元素 'a'
​
console.log(letters[4 - 2]); // 访问索引为 2 的元素 'c'
​
letters[1] = 1; // 修改索引为 1 的元素 ['a', 1, 'c', 'd']
​
letters[1 + 2] = 3; // 修改索引为 3 的元素 ['a', 1, 'c', 3]
  • 根据下标添加和修改

var arr = ['Asa','Taylor'];
arr[2] = 'Tom';
arr[3] =  'Jack';
console.log(arr); 
  • delete关键字只能删除数组中指定下标的元素值,删除后该元素依然会占用一个空的存储位置。

  var stu = ['Tom', 'Jimmy', 'Lucy'];
  console.log(stu); // 输出结果:(3) ["Tom", "Jimmy", "Lucy"]
  delete stu[1];    // 删除数组中第2个元素
  console.log(stu); // 输出结果:(3) ["Tom", empty, "Lucy"]

1.4 数组长度

每个数组都有一个 length 属性,length 属性值代表数组中元素的个数。

var empty = []; // 数组没有元素
​
var letters = ['a', 'b', 'c', 'd']; // 数组有 5 个元素
​
var arr = ['a', , , , 'b', 'c'];
​
console.log(empty.length); // 0
​
console.log(letters.length); // 5
​
console.log(arr.length); // 6
​
  • 修改数组长度

  • 大于数组长度

var arr1 = [];
arr1.length = 5;
console.log(arr1);      // 输出结果:(5) [empty × 5]
var arr2 = [1, 2, 3];
arr2.length = 4; 
console.log(arr2);      // 输出结果:(4) [1, 2, 3, empty]
​
  • 小于数组长度

var arr4 = ['hehe', 'xixi', 'gugu', 'jiujiu'];
arr4.length = 3; 
console.log(arr4);      // 输出结果:(3) ["hehe", "xixi", "gugu"]

1.5 数组遍历数组

在创建完数组后,如何遍历数组中的元素,对其进行操作呢? 一维数组可以利用for、forEach、for…of进行遍历,目前先介绍for,之后我们再学习其他.

  • 使用 for 循环遍历数组

    var heroes = ['刘邦', '张良', '韩信', '萧何','刘备'];
    
    var len = heroes.length;
    
    for (var i = 0; i < len; i++) {
    
    	console.log(heroes[i])
    
    }

1.6 二维数组

  • 数组还可以根据维数划分为一维数组、二维数组、三维数组等多维数组。

  • 解决开始提出的问题:保存一个班级学生信息,每个数组元素都代表一个学生,而每个学生都使用一个一维数组分别表示其姓名、学号、年龄等信息,这样通过一个变量即可有规律的保存一个班级的所有学生信息,方便开发时进行处理。 二维数组:是指数组元素的“值”是一个一维数组,如下图。

  • 创建

// 使用“[]”创建数组
var num = [[1, 3], [2, 4]];
var empty = [[], []];		            // 空二维数组
// 使用Array对象创建数组
var info = new Array(new Array('Tom', 13, 155), new Array('Lucy', 11, 152));
var arr = new Array(new Array, new Array);// 空二维数组
  • 二维数组遍历

    二维数组只需在遍历数组后,再次遍历数组的元素即可。

    var arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 0]];
    // 遍历外层
    for (var i = 0; i < arr.length; i++) {
        // console.log(arr[i]);
        // 遍历里层
        for (var j = 0; j < arr[i].length; j++) {
            console.log(arr[i][j]);
        }
    }

1.7 数组排序(重点)

1.7.1 最大值和最小值

    if (arr[i] > max) {    // 当前元素比最大值max大,则修改最大值
      max = arr[i];
    }
    if (arr[i] < min) {    // 当前元素比最小值min小,则修改最小值
      min = arr[i];
    }

1.7.2 冒泡排序

实现原理:在冒泡排序的过程中,按照要求从小到大排序或从大到小排序,不断比较数组中相邻两个元素的值,将值大的元素或最小的元素交换至右端。

1. 算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2. 动图演示

 var arr = [10, 2, 5, 27, 98, 31];
  console.log('待排序数组:' + arr);
  for (var i = 0; i < arr.length-1; i++) {          // 控制需要比较的轮数
    for (var j = 0; j < arr.length - i-1; j++) {    // 控制参与比较的元素
      if (arr[j] > arr[j + 1]) {                  // 比较相邻的两个元素
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];//解构交换
      }
    }
  }
  console.log('排序后的数组:' + arr);
 //两个变量值的交换---》面试题

  var temp=null; //定义一个第三方的变量
  temp=num1  //temp=10
  num1=num2  //num1=100
  num2=temp  //num2=10
  

1.7.3 选择排序

1. 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

2. 动图演示

//选择排序
var arr= [10, 2, 5, 27, 98, 31];
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
     console.log('排序后的数组:'+arr);
  

2.数组操作方法(重点)

学习数组的方法要关注以下3个重点:

  • 方法参数

  • 返回值

  • 改变不改变原数组

2.1 栈方法和队列方法

2.1.1 push()

push()
功能描述将一个或多个元素添加到数组的末尾
语法arr.push(element1, ..., elementN)
参数被添加到数组末尾的元素。
返回值返回数组的新长度。
改不改变原数组改变原数组

2.1.2 pop()

pop()
功能描述从数组的末尾删除一个元素。
语法arr.pop()
参数
返回值返回数组中删除的元素,若是空数组则返回undefined
改不改变原数组改变原数组

2.1.3 unshift()

unshift()
功能描述将一个或多个元素添加到数组的开头
语法arr.unshift(element1, ..., elementN)
参数要添加到数组开头的元素或多个元素。
返回值返回数组的新长度。
改不改变原数组改变原数组

2.1.4 shift()

shift()
功能描述从数组的开头删除一个元素。
语法arr.shift()
参数
返回值返回数组中删除的元素,若是空数组则返回undefined
改不改变原数组改变原数组
  • 栈结构特点:先进后出 push(),pop();

  • 队列结构特点:先进先出 unshift(),shift();

2.2 检索方法

2.2.1 includes()

includes()
功能描述用于确定数组中是否含有某个元素。
语法array.includes(item, [start])
参数item是查找的元素,start可选,规定在数组中开始检索的位置(包含本身的位置)。
返回值true或false。
改不改变原数组不改变原数组

不同参数情况分析:

  • 如果start为负值,则从最后一项开始算起,-1为最后一项,-2为倒数第二项。

  • 如果 array.length + start为负值,则整个数组都会被搜索。

  • 如果start大于等于数组长度 ,则返回 false 。该数组不会被搜索。

2.2.2 indexOf()

indexOf()
功能描述检测当前值在数组中第一次出现的位置索引。
语法indexOf(item,[start])
参数item是查找的元素,start可选,规定在数组中开始检索的位置(包含本身的位置)。
返回值返回值是在数组中可以找到给定值的第一个索引,如果不存在,则返回-1。
改不改变原数组不改变原数组

不同参数情况分析:

  • 如果start为负值,则从最后一项开始算起,-1为最后一项,-2为倒数第二项。

  • 如果 array.length + start为负值,则整个数组都会被搜索。

  • 如果start大于等于数组长度 ,则返回-1 。该数组不会被搜索。

2.2.3 lastIndexOf()

lastIndexOf()
功能描述检测当前值在数组中最后一次出现的位置索引,从数组的后面向前查找,从 start处开始。
语法lastIndexOf(item,[start])
参数item是查找的元素,start可选,规定在数组中开始检索的位置(包含本身的位置)。
返回值返回指定元素在数组中的最后一个的索引,如果不存在则返回 -1。
改不改变原数组不改变原数组

不同参数情况分析:

  • 如果start为负值,则从最后一项开始算起,-1为最后一项,-2为倒数第二项。

  • 如果 array.length + start为负值,则该数组不会被搜索,则返回 -1。

  • 如果start大于等于数组长度 ,则整个数组都会被搜索。

2.3 数组转字符串

2.3.1 join()

join()
功能描述将数组的所有元素连接到一个字符串中。
语法arr.join([separator])
参数指定一个字符串来分隔数组的每个元素。 如果缺省该值,数组元素用逗号(,)分隔。 如果separator是空字符串 (""),则所有元素之间都没有任何字符。
返回值一个所有数组元素连接的字符串。如果 arr.length 为 0,则返回空字符串。
改不改变原数组不改变原数组

2.3.2 toString()

toString()
功能描述返回包含所有数组值的字符串,以逗号分隔。
语法arr.toString()
参数
返回值一个表示指定的数组及其元素的字符串。
改不改变原数组不改变原数组

注意:

  1. join()和toString()方法的相同点:

可将多维数组转为字符串,默认情况下使用逗号连接。 当数组元素为undefined、null或空数组时,数组会被转换为空字符串

  1. join()和toString()方法的不同点:

join()方法可以指定连接数组元素的符号。

2.4 其他方法

2.4.1 Array.isArray()

Array.isArray()
功能描述用于确定传递的值是否是一个数组。
语法Array.isArray(obj)
参数需要检测的值
返回值如果值是 Array,则为 true;否则为 false
改不改变原数组不改变原数组

2.4.2 splice()(重点)

splice()
功能描述通过删除或者替换(修改)现有元素或者原地添加新的元素来修改数组。
语法array.splice(index[, deleteCount[, item1[, item2[, ...]]]])
参数index:必需。规定从何处添加/删除元素。 该参数是开始插入和(或)删除的数组元素的下标,必须是数字。 deleteCount:表示要移除的数组元素的个数。 item1, item2, ...:要添加进数组的元素。
返回值以数组形式返回被修改的内容。
改不改变原数组改变原数组

不同参数情况分析:

对数组进行增删改

  • 增加:arr.splice(index, 0, item)

    • 从索引index开始, deleteCount(可选):0

    • 把item或者更多的内容插入到索引index的前面

    • 返回值:返回空数组

  • 修改: arr.splice(index, x, item)

    • 从索引index开始,删除x个元素, item替换删除的部分

    • 把原有内容删除掉, 然后用新内容替换掉

    • 返回值:修改掉原有内容的数组

  • 删除:arr.splice(index,x)

    • 从索引index开始,删除x个元素

    • (如果第二个参数省略, 则从index删除到末尾)

    • 返回值:删除掉原有内容的数组

//增加
var ary1 = [33,44,55,66,77,88];
ary1.splice(2,0,'a','b')
console.log(ary1);// [33, 44, "a", "b", 55, 66, 77, 88]

//修改
var ary2 = [33,44,55,66,77,88];
ary2.splice(1,2,'x','y')
console.log(ary2);// [33, "x", "y", 66, 77, 88]

//删除
var ary3 = [33,44,55,66,77,88];
//console.log(ary3.splice(3,2))//[66, 77]
console.log(ary3.splice(3));//[66, 77, 88]
console.log(ary3.splice(0));//[33,44,55,66,77,88]

2.4.3 slice()

slice()
功能描述复制原数组的部分内容。
语法array.slice(start, end)
参数start:可选。规定从何处开始选取。 如果是负数,那么它规定从数组尾部开始算起的位置。 也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。如果省略 start,则 slice 从索引 0 开始。 end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。 如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。 如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。(不包含end)
返回值返回一个含有被提取元素的新数组。
改不改变原数组不改变原数组

不同参数情况分析:

array.slice(start, end),从索引start开始查找到end处(不包含end)

array.slice(start) 第二个参数省略,则一直查找到末尾

array.slice(0)原样输出内容,可以实现数组克隆

array.slice(-start,-end) slice支持负参数,从最后一项开始算起,-1为最后一项,-2为倒数第二项

var ary1 = [1,2,3,4,5,6,7,8,9];
 //console.log(ary1.slice(2,8));//从索引2开始查找到索引为8的内容,结果为[3, 4, 5, 6, 7, 8]
 //console.log(ary1.slice(0));
 console.log(ary1.slice(-2,-1));//[8]

2.4.5 reverse()

reverse()
功能描述数组中元素的位置颠倒,并返回该数组。
语法arr.reverse()
参数
返回值颠倒后的数组。
改不改变原数组改变原数组
var ary1 = [6,8,10,12]; 
console.log(ary1.reverse());//[12, 10, 8, 6]

2.4.6 concat()

concat()
功能描述用于连接两个或多个数组。
语法concat(value1[, value2[, ...[, valueN]]])
参数value可选,参数可以是具体的值,也可以是数组对象。可以是任意多个
返回值返回连接后的新数组。
改不改变原数组不改变原数组
var ary1 = ['你'];
var ary2 = ary1.concat('好');
console.log(ary2);//["你", "好"]

2.5 清空数组(内容)

// 方式1 推荐 
arr = [];
// 方式2 
arr.length = 0;
// 方式3
arr.splice(0, arr.length);
arr.splice(0);

2.6 数组方法总结

改变原数组方法
arr.push()将一个或多个元素添加到数组的末尾
arr.pop()从数组的末尾删除一个元素。
arr.unshift()将一个或多个元素添加到数组的开头
arr.shift()从数组的开头删除一个元素。
arr.splice()通过删除或者替换现有元素或者原地添加新的元素来修改数组。
arr.reverse()数组中元素的位置颠倒,并返回该数组。
不改变原数组方法
arr.includes()用于确定数组中是否含有某个元素。
arr.indexOf()检测当前值在数组中第一次出现的位置索引。
arr.lastIndexOf()检测当前值在数组中最后一次出现的位置索引,从数组的后面向前查找,从 start处开始。
arr.join()将数组的所有元素连接到一个字符串中。
arr.toString()返回包含所有数组值的字符串,以逗号分隔。
arr.slice()复制原数组的部分内容。
arr.concat()用于连接两个或多个数组。
*我可以

常用的操作数组的方法有哪些,请分别介绍它的功能。

标签:03,arr,元素,console,log,JavaScript,数组,var
From: https://blog.csdn.net/weixin_55702682/article/details/137104213

相关文章

  • 算法小笔记0328
    1ios::sync_with_stdio(0);ios::sync_with_stdio(false);是C++中用于关闭C++输入输出流(iostream)与C输入输出库(stdio)同步的语句。默认情况下,C++的流库与C的stdio库是同步的,这意味着你可以混用cin,cout和scanf,printf等而不会出现问题。但是这种同步会导致性能下......
  • Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的
    这道题目是经典的求子数组之和=goal的个数,用map维护。但是笔者在实现的过程中发现0的情况不是很好出来,问题在于mp[sum]和sum+=num的代码语句存在位置问题。后来看了下代码还是自己没有考虑清楚。这种类型的题目就是要想清楚你的做法,以及边界条件。classSolution{public:......
  • JavaScript变量/数组
    变量1、var:全局变量(作用域范围大,且允许重复声明)2、let:局部变量(作用域仅在代码块内,且不允许重复声明)3、const:常量(一旦声明,常量的值不能改变)数组特点:长度可变,类型可变for和foreach的区别:1、for遍历数组中的所有元素2、foreach遍历数组中有值的元素,并调用一次传入的函......
  • 暖心推荐:三螺杆泵 IMO中国ACE038L3NVBP 2024已更新(每日/实时)
    暖心推荐:三螺杆泵IMO中国ACE038L3NVBP2024已更新(每日/实时)暖心推荐:三螺杆泵IMO中国ACE038L3NVBP2024已更新(每日/实时)暖心推荐:三螺杆泵IMO中国ACE038L3NVBP2024已更新(每日/实时)ACG052N7NVBP进口三螺杆泵组瑞典IMO泵IMO双螺杆泵IMO三螺杆泵瑞典IMO工业公司,......
  • 解决 TS7053: Element implicitly has an any type because expression of type strin
    背景有个接口interfaceDataType{id:number;name:string;created_at:string;updated_at:string;}我的数据{"id":9,"created_at":"2024-03-11T17:50:16.129235+08:00","updated_at":"202......
  • 力扣由浅至深 每日一题.16 ​ 合并两个有序数组​
    日复一日的生活里也会有新的快乐                 ——24.3.27合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2......
  • 【剑指offer】73. 数组中只出现一次的两个数字(超详解)
    题目链接acwingleetcode题目描述给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。输入:nums=[1,2,......
  • 20240327
    T1洛谷P2047社交网络暴力Floyd跑出每两个点间最短路及其条数,然后暴力枚举算。代码#include<iostream>#include<string.h>#include<iomanip>#include<queue>#defineintlonglongusingnamespacestd;intn,m;intdist[105][105];intcnt[105][105];sign......
  • 2003 年考研英语真题 - 阅读 1 解析
    2003 年考研英语真题 - 阅读 1 解析WildBillDonovanwouldhavelovedtheInternet.[1]        翻译:WildBillDonovan 应该会喜欢互联网。TheAmericanspymasterwhobuilttheOfficeofStrategicServicesintheWorldWarⅡandlaterlaidtheroo......
  • 2003 年考研英语真题 - 阅读 4 解析
    2003 年考研英语真题 - 阅读 4 解析ItissaidthatinEnglanddeathispressing,inCanadainevitableandinCaliforniaoptional.[1] 翻译:据说,在英国,死亡是迫在眉睫的;在加拿大,死亡是不可避免的;而在加利福尼亚,死亡是可以选择的。1.Itissaidthat 据说。2.i......