简介

  1. 数组(Array),顾名思义,用来存储一组相关的值,从而 方便进行求和、计算平均数、逐项遍历等操作。是非常重要的一种数据结构 。**数组可以存放任何类型的数据。**

定义数组

  1. 第一种:只需要使用方括号[]即可
  1. let arr = ['A', 'B', 'C' , 'D''E'];
  1. 第二种:
  1. let arr = new Array('A' , 'B' , 'C', 'D','E');
  1. 第三种: 表示定义一个长度为n的数组,但是这n项都是 undefined
    1. var arr = new Array(2); //2代表长度,但是这两项都是undefined

数组类型的检测

typeof检测

结果是 obeject (不能判断出是数组还是真的对象)

Array.isArray()方法

可以用来检测数组.得到的结果是布尔值

  1. Array.isArray([]); // true

数组的使用

遍历数组

for循环

  1. let names = ['没', '有', '喜', '欢', '的', '人'];
  2. for (let i = 0; i < names.length; i++) {
  3. console.log(names[i]);
  4. }
  1. //将数组的元素相加
  2. let arr = [1, 2, 4, 56, 5, 3, 20];
  3. let sum = 0;
  4. for (let i = 0; i < arr.length; i++) {
  5. sum += arr[i]
  6. }
  7. console.log(sum / arr.length); //平均值
  8. console.log(sum);

foreach

  • foreach不能通过break打断,for循环可以通过break打断
  1. foreach不能通过break打断,for循环可以通过break打断
  2. const arr = [1, 23, 8];
  3. arr.forEach((value, index) => console.log(`下标是${index},值是${value}`));
  4. arr.forEach(value => {
  5. console.log(value);
  6. });

表格

方法(方法就是打点调用的函数) 作用
push() 在尾部插入新项
pop() 在尾部删除
unshift() 在头部插入新项
shift() 在头部删除
  1. 使用以上方法,用数组打点调用

添加数组元素

数组.push() 方法

将一个或多个元素添加到数组的末尾并返回该数组的新长度。推入多个用逗号隔开。

  1. let arr1 = ['我', '加', '了']
  2. //添加新元素 == 返回 添加新元素之后的数组长度
  3. let arrLength = arr1.push('哈哈');
  4. console.log(arr); //["我", "加", "了", "哈哈]
  5. console.log(arrLength); // 4
  6. console.log(arr1.length); // 4
  1. //动态增加元素
  2. let arr = [];
  3. for (let i = 0; i < 2; i++) {
  4. let userName = prompt("请输入名字");
  5. arr.push(userName);
  6. }
  7. console.log(arr);
  1. let arr = [12, 3, 44, 55, 6, 33, 5];
  2. //newArr存放过滤好的元素
  3. let newArr = [];
  4. for (let i = 0; i < arr.length; i++) {
  5. if (arr[i] > 10) {
  6. // 把大于10的元素添加到newArr
  7. newArr.push(arr[i]);
  8. }
  9. }
  10. console.log(arr);
  11. console.log(newArr); //12 44 55 33
  12. </script>

数组.unshift()方法

将一个或多个元素添加到数组的开头并返回该数组的新长度

  1. let arr = [2, 3, 4, 5, 6];
  2. arr.unshift(1);
  3. console.log(arr); // 1 2 3 4 5

删除数组元素

数组.pop() 方法

  1. 用来删除数组中的最后一项
  2. 不仅会删除数组末项,而且会返回被删除的项(需要用变量接收输出)
    1. // 直接删除最后一项
    2. let arr = ['苹果', '西瓜', '橙子'];
    3. // 用变量item接收被删除的值
    4. let item = arr.pop()
    5. console.log(arr); // ['苹果', '西瓜'];
    6. console.log(item); // 橙子

数组. shift() 方法

  1. 用来删除数组中的第一项(下标为0)
  2. 不仅会删除数组首项,而且会返回被删除的项(与pop类似)
  1. // 直接删除第一项
  2. let arr = ['苹果', '西瓜', '橙子'];
  3. // 用变量item接收被删除的值
  4. let item = arr.shift()
  5. console.log(arr); // ['西瓜', '橙子'];
  6. console.log(item); // 苹果

splice() 方法

说明

  1. 万能方法
  2. splice()方法会以数组的形式返回被删除的项

使用方法

  1. 指定位置删除或增加元素
  2. splice(‘想要删除的元素的下标’, ‘想要删除几个’, ‘在该下标位置添加元素’)
  1. // 指定位置删除元素
  2. let arr = [1, 2, 3, 4, 5, 6];
  3. // 在1的位置,删除一个元素,增加一个元素‘s’
  4. arr.splice(1, 1, 's');
  5. // 在2的位置,增加一个元素,增加一个元素‘t’
  6. arr.splice(2, 0, 't');
  7. console.log(arr); // 1 's' 't' 3 4 5 6

2.替换数组中的指定项

  1. // 替换数组中的指定项
  2. let arr = ['A', 'B', 'C', 'D', 'E'];
  3. arr.splice(3, 2, 'X', 'Y', 'Z')
  4. console.log(arr); //['A', 'B', 'C', 'X', 'Y','Z'];

Javascript数组的定义和基本使用 - 图1

3.在指定位置插入新项

  1. //在指定位置插入新项
  2. let arr = ['A', 'B', 'C', 'D', 'E'];
  3. arr.splice(2, 0, 'X', 'Y', 'Z'); //在下标为2插入
  4. console.log(arr); //['A','B','X','Y','Z','C','D','E'];

4.删除指定项

  1. // 删除指定项
  2. 1. let arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
  3. arr.splice(2, 4); //没有设置替换的新项,仅删除4项
  4. console.log(arr); //['A', 'B', 'G'];
  5. 2. let arr = ['q', 'w', 'e', 'r', 't'];
  6. arr.splice(2, 1); //从下标为2的项,仅删除1项
  7. console.log(arr); //['q', 'w', 'r', 't'];

5.替换指定项

  1. let arr = ['q', 'w', 'e', 'r', 't'];
  2. arr.splice(2, 1, '替换的'); //从下标为2的项,替换为'替换的'
  3. console.log(arr); //['q', 'w', '替换的', 'r', 't']

slice() 方法

说明

  1. slice() 方法用于得到子数组,类似于字符串的slice方法。
  2. slice(a, b)截取的子数组 从下标为a的项开始,到下标为b(不包含下标为b的项)结束。
  3. slice()如果不提供第二个参数,则表示从指定项开始,提取所有后续所有项作为子数组。
  4. slice()方法的参数允许为负数,表示数组的倒数第几项。

使用方法

  1. let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  2. let child_arr1 = arr.slice(2, 5); //从第二项开始,不包括第五项
  3. let child_arr2 = arr.slice(2);
  4. let child_arr3 = arr.slice(5, -2); //取到倒数第二项,不包括倒数第二项
  5. console.log(arr); //不改变原数组
  6. console.log(child_arr1); //3, 4, 5
  7. console.log(child_arr2); //3, 4, 5, 6, 7, 8, 9
  8. console.log(child_arr3); //6, 7

join()

  1. 数组的join()方法可以使数组转为字符串
  2. join()的参数表示以什么字符作为连接符,如果留空则默认以逗号分隔,如同调用toString()方法。
  1. //join()留空,默认是逗号分隔
  2. [1,2,3,4,5,6].join()
  3. 得到:"1,2,3,4,5,6"
  4. 等同于
  5. [1,2,3,4,5,6].toString()
  6. 得到:"1,2,3,4,5,6"
  7. //使用 - 连接每个字符
  8. [1,2,3,4,5,6].join('-')
  9. 得到:"1-2-3-4-5-6"
  10. //使用 ~ 连接每个字符
  11. [1,2,3,4,5,6].join('~')
  12. 得到:"1~2~3~4~5~6"
  13. //空字符串表示不要任何连接符
  14. [1,2,3,4,5,6].join('')
  15. 得到:"123456"

split()

  1. split() 方法用于把一个字符串分割成字符串数组
  2. split()的参数表示以什么字符拆分字符串,一般不能留空。
  3. split() 方法不改变原始字符串。
  1. 'abcde'.split()
  2. ["abcde"]
  3. let str="How are you doing today?";
  4. let n = str.split("");
  5. 得出:H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
  6. 'abcde'.split('')
  7. ["a", "b", "c", "d", "e"]
  8. 'a-b-c-d-e'.split('')
  9. ["a", "-", "b", "-", "c", "-", "d", "-", "e"]
  10. //以 - 号分隔 ,用谁分割谁就不在了
  11. 'a-b-c-d-e'.split('-')
  12. ["a", "b", "c", "d", "e"]

indexOf()

  1. 功能是搜索数组中的元素,并返回它所在的位置,如果元素不存在,则返回-1。
  1. [1,2,88].indexOf(2)
  2. 得出:1
  3. ['A','B','C','D'].indexOf('D')
  4. 得出:3
  5. //如果没有该元素返回 -1
  6. ['A','B','C','D'].indexOf('K')
  7. 得出:-1
  8. //判断的依据是全等 ===,既要判断值,又要判断类型
  9. [1,2,88].indexOf('2')
  10. 得出:-1

includes()

  1. 功能是判断一个数组是否包含一个指定的值,返回布尔值。
  1. //判断的依据是全等 ===,既要判断值,又要判断类型
  2. [1,2,88].includes('2')
  3. 得出:false
  4. [1,2,88].includes(2)
  5. 得出:true

数组去重
  1. //数组去重
  2. let arr = [1, 22, 33, 44, 44, 5, 5, 66];
  3. //存放结果数组
  4. let newArr = [];
  5. for (let i = 0; i < arr.length; i++) {
  6. // 判断遍历的结果是否在结果数组中,如果不在就推入
  7. //includes方法用于判断是否在数组中
  8. if (!newArr.includes(arr[i])) {
  9. newArr.push(arr[i])
  10. }
  11. }
  12. console.log(newArr);

concat()方法

  1. 可以合并连接多个数组
  2. concat()不会改变原数组。
  1. let arr1 = [1, 2, 3, 4, 5];
  2. let arr2 = ['6', '7', '8', '9'];
  3. let arr3 = [9, 10, 11, 12];
  4. let arr = arr1.concat(arr3)
  5. console.log(arr); //[1, 2, 3, 4, 5, "6", "7", "8", "9", 9, 10, 11, 12]

map方法

  1. 根据原来的数组,来返回新的数组
  2. 循环数组,在循环的回调函数中可以返回新的数据,组装成新的数组(新数组中的元素是原数组中的每个元素执行回调函数后的返回值,在该回调函数中可根据需要处理数据并返回。)
  3. map()不会对空数组进行检索
  4. map()不会为数组中缺少的元素调用回调函数
  5. 除数组对象外,map()可由具有length属性且具有已按数字编制索引名的任何对象使用(例如字符串对象)
  1. const texts = ["刘德华", "郭德纲", "林志颖"];
  2. const newTexts = texts.map(value => `<div>${value}</div>`);
  3. //得到 [<div>刘德华</div>,<div>郭德纲</div>,<div>林志颖</div>]
  4. console.log(newTexts);
  5. //得到 [<div>刘德华</div>,<div>郭德纲</div>,<div>林志颖</div>]
  6. // 把它转成字符串
  7. const html = newTexts.join(""); // <div>刘德华</div><div>郭德纲</div><div>林志颖</div>
  8. console.log(html);
  9. document.body.innerHTML = html
  10. const renderHTML = value =>`<div>${value}</div>`
  11. document.body.innerHTML=["刘德华","郭德纲","林志颖"].map(renderHTML).join("");

filter方法

过滤或筛选数组
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

  1. let newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])

参数

callback
循环数组每个元素时调用的回调函数。回调函数返回 true 表示保留该元素,false 则不保留。它接受以下三个参数:
(1)element
数组中当前正在处理的元素。
(2)index可选
正在处理的元素在数组中的索引。
(3)selfArr可选
调用了 filter 方法的数组本身。

thisArg可选
执行 callback 时,用于 改变callback函数this 的值。

返回值
一个新的、由调用callback函数返回值为true的元素组成的数组,如果callback函数调用米没有返回true,则返回空数组。

every方法

要求数组中每一个元素都满足条件,返回true

  1. const arr = [
  2. { id: 1, name: '西瓜', state: true },
  3. { id: 2, name: '苹果', state: true }
  4. ]
  5. const res = arr.every(item=> item.state === true)
  6. console.log(res) // true

some方法

在找到对应的项之后,可以通过return true的固定语法,来终止 some 循环

  1. const arr = [
  2. { id: 1, name: '西瓜', state: true },
  3. { id: 2, name: '苹果', state: true }
  4. ]
  5. arr.some((item, index) => {
  6. if(item === '西瓜') {
  7. return true
  8. }
  9. })

要求数组最少有一个满足条件,返回true

  1. some();
  2. function some() {
  3. // 检测数组,其中只要有一个元素符合条件,some返回true (every要求每一个都符合)
  4. const arr = [1, 3, 4, 6, 2];
  5. // 这个数组里面有没有元素大于6的
  6. const result = arr.some((value) => value > 6);
  7. console.log(result)
  8. /*
  9. every 和 some 一起记
  10. every 要求全部都符合
  11. some 最少有一个符合即可
  12. */
  13. }

reverse()方法

  1. 用来将一个数组中的全部项顺序置反。
  2. reverse()方法会改变原数组。
  1. let arr = ['a', 'b', 'c', 'd'];
  2. arr.reverse();
  3. //会改变原数组
  4. console.log(arr); //['d', 'c', 'b', 'a']

reduce()方法

  1. 语法:
  2. array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

image.png
接受一个回调函数作为参数
image.png
更多使用方法:https://www.jianshu.com/p/f7ddbef3848c

isArray()方法

判断对象是否为数组。

字符串和数组

  1. 字符串和数组更多相关特性:
  2. 字符串可以使用方括号内写下标的形实,访问某个字符(更方便了),等价于chatAt()方法。
  1. '快乐女孩'[0] //"快"
  2. '快乐女孩'.chatAt[0] //"快"

字符串数组

  1. 'abcdef'.split('')
  2. 得出:["a", "b", "c", "d", "e", "f"]
  3. 'abcdef'.split('').reverse()
  4. 得出:["f", "e", "d", "c", "b", "a"]
  5. 'abcdef'.split('').reverse().join()
  6. 得出:"f,e,d,c,b,a"
  7. 'abcdef'.split('').reverse().join('')
  8. 得出:"fedcba"

字符串拓展

  1. 字符串转大写 toUpperCase()
  2. 字符串转小写 toLowerCase()

获取数组长度

数组.length

  1. let arr = [1,2,3,4,5];
  2. console.log(arr.length); // 5

获取数组最后一个元素

arr[arr.length - 1] 常用的规则

  1. let arr = ['快乐', '女孩', '哈哈'];
  2. console.log(arr[arr.length - 1]); //哈哈

修改数组

数组[下标] = ‘修改的元素’;

  1. let arr = [1,3,3,4];
  2. arr[1] = 2;
  3. console.log(arr); //1 2 3 4

清空数组

  1. 数组 = [ ]
  2. 数组.length = 0;

指定保留数组长度

例如:只保留长度为3

  1. arr.length = 3;

伪数组转数组

push

  1. <ul>
  2. <li>1</li>
  3. <li>2</li>
  4. <li>3</li>
  5. </ul>
  6. <script>
  7. // 获取dom元素的伪数组
  8. const lis = document.querySelectorAll('li');
  9. const list = toArr(lis);
  10. // list.splice(0,1);
  11. console.log(list);
  12. console.log(list[0]);
  13. // 定义一个函数,将伪数组转成真正的数组
  14. function toArr(arrayLike) { // ArrayLike伪数组
  15. // 声明一个空数组arr将循环的伪数组元素装起来
  16. const arr = [];
  17. // 对伪数组遍历
  18. for (let i = 0; i < arrayLike.length; i++) {
  19. arr.push(arrayLike[i])
  20. }
  21. // 返回数组
  22. return arr;
  23. }
  24. </script>

拓展运算符 …数组

  1. const arr = [...dom数组]
  2. <ul>
  3. <li>1</li>
  4. <li>2</li>
  5. <li>3</li>
  6. <li>4</li>
  7. <li>5</li>
  8. </ul>
  9. <script>
  10. const lis = document.querySelectorAll('li'); // 伪数组
  11. // const liList=domToArr(lis);
  12. // console.log(liList.every);
  13. // 转成真正的数组 一堆方式
  14. // const liList = [].concat(lis);
  15. // liList = [ lis伪数组 ]
  16. // liList[0] = lis伪数组
  17. // liList[0].every === lis.every 伪数组调用every
  18. // console.log(liList[0].every);
  19. // 现在先简单用一个
  20. // const liList=[...伪数组]
  21. const liList = [...lis]; // 最简单的转伪数组的方式 先这么用

二维数组

以数组作为数组元素的数组,即“数组的数组”

二维数组可看作矩阵

遍历二维数组

  1. let twoDimension = [
  2. //下面的每个数组都是一个元素
  3. [1, 2, 3, 4],
  4. [5, 6, 7, 8],
  5. [9, 10, 11, 12]
  6. ];
  7. console.log(twoDimension.length); //3
  8. // 循环输出二维数组每一项
  9. for (let i = 0; i < twoDimension.length; i++) {
  10. for (let j = 0; j < 4; j++) {
  11. console.log(twoDimension[i][j]);
  12. }
  13. }

数组的案例

动态生成圆柱

  1. /*动态获取用户输入的高度 ,然后把高度都设置到一个数组即可 1 弹出4个窗口,让用户输入数据 */
  2. // 关键代码
  3. let liHtml = `<ul>`;
  4. let liHeight = [];
  5. // li的高
  6. for (let i = 0; i < 4; i++) {
  7. // 弹出四个窗口获取li高度
  8. let height = +prompt("请输入高度");
  9. //把高添加到liHeight数组中
  10. liHeight.push(height);
  11. }
  12. for (let i = 0; i < 4; i++) {
  13. liHtml += `
  14. <li style="height: ${liHeight[i]}px;">
  15. <span>${liHeight[i]}</span>
  16. <div>第${i+1}季度</div>
  17. </li>
  18. `;
  19. }
  20. liHtml += `</ul>`;
  21. document.write(liHtml)

随机样本

  1. //随机从原数组中抽取三项
  2. // 思路:准备一个空数组装起来,再遍历原数组,随机选择一项,推入结果数组,并且把这项删除,免得重复
  3. let arr = [1, 4, 3, 7, 9, 8];
  4. // 存放结果数组
  5. let result = [];
  6. for (let i = 0; i < arr.length; i++) {
  7. // 随机选择一项的 下标 ,数组的下标0~arr.length - 1
  8. // random的公式,[a, b] 区间的随机数是parseInt(Math.random() * (b - a + 1) + a)
  9. let n = parseInt(Math.random() * arr.length);
  10. // 把它推入结果数组
  11. result.push(arr[n]);
  12. // 删除这项,避免重复选到
  13. arr.splice(n, 1);
  14. }
  15. console.log(result);

Javascript数组的定义和基本使用 - 图4

数组去重

  1. //数组去重
  2. let arr = [1, 22, 33, 44, 44, 5, 5, 66];
  3. //存放结果数组
  4. let newArr = [];
  5. for (let i = 0; i < arr.length; i++) {
  6. // 判断遍历的结果是否在结果数组中,如果不在就推入
  7. //includes方法用于判断是否在数组中
  8. if (!newArr.includes(arr[i])) {
  9. newArr.push(arr[i])
  10. }
  11. }
  12. console.log(newArr);

冒泡排序

4个数字,共需比较3趟,比较次数为为3+2+1=6次

n个数字,共需比较n - 1趟,比较次数为为n(n-1)/2

  1. let arr = [1, 23, 45, 3];
  2. // 一趟趟比较,序号是i
  3. for (let i = 0; i < arr.length; i++) {
  4. // 内层循环负责两两比较
  5. for (let j = arr.length - 1; j >= i; j--) {
  6. // 判断项的大小
  7. if (arr[j] < arr[j - 1]) {
  8. // 如果这一项比前一项小,就交换两个位置
  9. let temp = arr[j];
  10. arr[j] = arr[j - 1];
  11. arr[j - 1] = temp;
  12. }
  13. }
  14. }
  15. console.log(arr);