当前位置: 首页 > news >正文

JavaScript高级程序设计读书分享之6章——6.2Array

JavaScript高级程序设计(第4版)读书分享笔记记录

适用于刚入门前端的同志

 除了 ObjectArray 应该就是 ECMAScript 中最常用的类型了。

创建数组

  • 使用 Array 构造函数

在使用 Array 构造函数时,也可以省略 new 操作符。

let colors = new Array()
let colors = new Array("red", "blue", "green");let colors = Array(3); // 创建一个包含 3 个元素的数组
let names = Array("Greg"); // 创建一个只包含一个元素,即字符串"Greg"的数组
  • 数组字面量表示法
let colors = ['red','blue','green']
let values = [1,2,3]
  • Array 构造函数还有两个 ES6 新增的用于创建数组的静态方法from() of()

Array.from()

JavaScript from() 方法 | 菜鸟教程

        Array.from()的第一个参数是一个类数组对象,即任何可迭代的结构,或者有一个 length 属性
和可索引元素的结构。
let arr = Array.from('Matt)
console.log("arr")//['M','a','t','t']// Array.from()对现有数组执行浅复制
const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1); 
console.log(a1); // [1, 2, 3, 4] 
console.log(a2); // [1, 2, 3, 4] 
alert(a1 === a2); // false

Array.of()
Array.of()可以把一组参数转换为数组。
let arr = Array.of(1,2,3,4)
console.log("arr",arr) // [1,2,3,4]

数组索引

 要取得或设置数组的值,需要使用中括号并提供相应值的数字索引

let colors = ["red", "blue", "green"]; // 定义一个字符串数组
alert(colors[0]); // 显示第一项
colors[2] = "black"; // 修改第三项
colors[3] = "brown"; // 添加第四项
cosnole.log(colors) //["red", "blue", "black","brown"]

检测数组

if (value instanceof Array){ // 操作数组
}if (Array.isArray(value)){ // 操作数组
}

迭代器方法

keys()

keys()返回数组索引的迭代器
const a = ["foo", "bar", "baz", "qux"];
const akeys = a.keys()
for(let arr of akeys){console.log(arr) // 0 1 2 3
}

values()

values()返回数组元素的迭代器
const a = ["foo", "bar", "baz", "qux"];
const avalues = a.values()
for(let arr of avalues){console.log(arr) // "foo"  "bar"  "baz"  "qux"
}

entries()

entries()返回索引/值对的迭代器
const a = ["foo", "bar", "baz", "qux"];
const aentries = a.entries()
for(let [index,item] of aentries){console.log(index,item) 
}//0 'foo'
//1 'bar'
//2 'baz'
//3 'qux'

复制和填充方法

ES6 新增了两个方法:批量复制方法 copyWithin(),以及填充数组方法 fill()
JavaScript fill() 方法 | 菜鸟教程
JavaScript copyWithin() 方法 | 菜鸟教程

转换方法

toString()

let colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
console.log(colors.toString()); // red,blue,green

valueOf()

let colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
console.log(colors.valueOf())//['red', 'blue', 'green']

join()

let colors = ["red", "green", "blue"]; 
console.log(colors.join(",")); // red,green,blue 
console.log(colors.join("||")); // red||green||blue

栈方法

栈是一种后进先出(LIFOLast-In-First-Out)的结构,也就是最近添加的项先被删除.

push()

push()方法接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度。
let colors = new Array(); // 创建一个数组
let count = colors.push("red", "green"); // 推入两项
console.log("count",count)// 2
console.log("colors") ["red", "green"]

pop()

pop()方法则用于删除数组的最后一项,同时减少数组的 length 值,返回被删除的项。
let colors = ['red','green','bule']
let item = colors.pop(); // 取得最后一项
console.log("item",item) //bule
console.log(colors) ['red','green']

队列方法

队列以先进先出(FIFOFirst-In-First-Out)形式限制访问

shift()

它会删除数组的第一项并返回它,然后数组长度减 1
let colors = ['red','green','bule']
let item = colors.shift(); // 取得最后一项
console.log("item",item) //red
console.log(colors) //['green','bule']

unshift()

在数组开头添加任意多个值,然后返回新的数组长度。
let colors = ['bule']; // 创建一个数组
let count = colors.unshift("red", "green");
console.log("count",count) // 3
console.log("colors",colors) //["red", "green",'bule']

排序方法

数组有两个方法可以用来对元素重新排序:reverse()sort()

reverse()

是将数组元素反向排列

let values = [1, 2, 3, 4, 5]; 
values.reverse();
console.log("values",values) //[5,4,3,2,1]

sort()

  • sort()会按照升序重新排列数组元素,即最小的值在前面,最大的值在后面。
  • sort()在每一项上调用 String()转型函数,然后比较字符串来决定顺序。即使数组的元素都是数值,也会先把数组转换为字符串再比较、排序。

以下代码示例,我们希望的是值升序排列为 0,1,5,10,15,但是用sort排序后得到却是[0,1,10,15,5]  ,就是因为sort()在每一项上调用 String()转型函数,然后比较字符串来决定顺序

let values = [0, 1, 5, 10, 15]; 
values.sort(); 
console.log(values); // [0,1,10,15,5]  
为此,sort()方法可以接收一个比较函数,用于判断哪个值应该排在前面。
比较函数接收两个参数;
升序
如果第一个参数应该排在第二个参数前面,就返回负值;
如果两个参数相等,就返回 0
如果第一个参数应该排在第二个参数后面,就返回正值。
function compare(value1, value2) { if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } 
}​
let values = [0, 1, 5, 10, 15]; 
values.sort(compare); 
console.log(values); // 0,1,5,10,15​
降序:
function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; } 
} 
let values = [0, 1, 5, 10, 15]; 
values.sort(compare); 
alert(values); // 15,10,5,1,0

如果数组的元素是数值,可以用两数相减,就能排序

function compare(value1, value2){ return value2 - value1; 
}let  values = [2,4,1,3,6,5]
values.sort(compare)
console.log(values) //[6,5,4,3,2,1]function compare(value1, value2){ return value1 - value2; 
}let  values = [2,4,1,3,6,5]
values.sort(compare)
console.log(values) //[1,2,3,4,5,6]

操作方法

concat()

concat()方法可以在现有数组全部元素基础上创建一个新数组,最后返回这个新构建的数组,不改变原数组
let colors = ["red", "green", "blue"]; 
let colors2 = colors.concat("yellow", ["black", "brown"]); 
console.log(colors); // ["red", "green","blue"] 
console.log(colors2); // ["red", "green", "blue", "yellow", "black", "brown"]

slice()

  • slice()用于创建一个包含原有数组中一个或多个元素的新数组。
  • slice()方法可以接收一个或两个参数:返回元素的开始索引和结束索引。
  • 如果只有一个参数,则 slice()会返回该索引到数组末尾的所有元素。
  • 如果有两个参数,则 slice()返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。
  • 如果 slice()的参数有负值,那么就以数值长度加上这个负值的结果确定位置
  • 不会改变原数组
let colors = ["red", "green", "blue", "yellow", "purple"]; 
let colors2 = colors.slice(1); 
let colors3 = colors.slice(1, 4); 
consle.log(colors2); // [green,blue,yellow,purple]
consle.log(colors3); // [green,blue,yellow]
console.log(colors) //["red", "green", "blue", "yellow", "purple"]; 

splice()

  •  删除。需要给 splice()2 个参数:要删除的第一个元素的位置和要删除的元素数量。
  •  插入。需要给 splice()3 个参数:开始位置、0(要删除的元素数量)和要插入的元素。
  •  替换要传入 3 个参数:开始位置、要删除元素的数量和要插入的任意多个元素。
let colors = ["red", "green", "blue"]; //删除
let removed = colors.splice(0,1); // 删除第一项
alert(colors); // green,blue 
alert(removed); // red,只有一个元素的数组//插入
removed = colors.splice(1, 0, "yellow", "orange"); // 在位置 1 插入两个元素
alert(colors); // green,yellow,orange,blue 
alert(removed); // 空数组//替换
removed = colors.splice(1, 1, "red", "purple"); // 插入两个值,删除一个元素
alert(colors); // green,red,purple,orange,blue 
alert(removed); // yellow,只有一个元素的数组

搜索和位置方法

 严格相等

  • indexOf()lastIndexOf()includes()。这三个方法都可以用来判断当前数组是否存在某个值
  • indexOf()lastIndexOf()都返回要查找的元素在数组中的位置,如果没找到则返回-1
  • includes()返回布尔值(includes是es7新增属性)
  • 这些方法都接收两个参数:要查找的元素和一个可选的起始搜索位置。
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
alert(numbers.indexOf(4)); // 3 
alert(numbers.indexOf(4, 4)); // 5 alert(numbers.lastIndexOf(4)); // 5 
alert(numbers.lastIndexOf(4, 4)); // 3 alert(numbers.includes(4)); // true 
alert(numbers.includes(4, 7)); // false //对象数组let person = { name: "Nicholas" }; 
let people = [{ name: "Nicholas" }]; 
let morePeople = [person]; alert(people.indexOf(person)); // -1 
alert(morePeople.indexOf(person)); // 0 
alert(people.includes(person)); // false 
alert(morePeople.includes(person)); // true

断言函数

  • 断言函数接收 3 个参数:元素、索引和数组本身。
  • 其中元素是数组中当前搜索的元素,索引是当前元素的索引,而数组就是正在搜索的数组。
  • 断言函数返回真值,表示是否匹配。
  • 找到匹配项后,这两个方法都不再继续搜索
find()findIndex()方法使用了断言函数。这两个方法都从数组的最小索引开始

find()

返回第一个匹配的元素

 const people = [{ name: "Matt", age: 27 }, { name: "Nicholas", age: 29 } ,{ name: "Jerry", age: 26} 
]; 
console.log(people.find((element, index, array) => element.age < 28)); 
// {name: "Matt", age: 27}

findIndex()

返回第一个匹配元素的索引。

 const people = [{ name: "Matt", age: 27 }, { name: "Nicholas", age: 29 } ,{ name: "Jerry", age: 26} 
]; 
console.log(people.findIndex((element, index, array) => element.age < 28)); 
//0

迭代方法

  • ECMAScript 为数组定义了 5 个迭代方法
  • 每个方法接收两个参数
  • 这些方法都不改变调用它们的数组。

every()

对数组每一项都运行传入的函数,如果对每一项函数都返回 true,则这个方法返回 true
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
let everyResult = numbers.every((item, index, array) => item > 2); 
console.log(everyResult); // false

some()

对数组每一项都运行传入的函数,如果有一项函数返回 true,则这个方法返回 true
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
let everyResult = numbers.some((item, index, array) => item > 2); 
console.log(everyResult); // true

filter()

对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后返回。
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
let filterResult = numbers.filter((item, index, array) => item > 2); 
console.log(filterResult); //[ 3,4,5,4,3]

forEach()

对数组每一项都运行传入的函数,没有返回值。
本质上,forEach()方法相当于使用 for 循环遍历数组。
let newarr =[]
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
numbers.forEach((item, index, array) => { // 执行某些操作 
item += 1newarr.push(item)
});
console.log(numbers) //[1,2,3,4,5,4,3,2,1]
console.log(newarr) // [2,3,4,5,6,5,4,3,2]

map()

对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。
let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
let mapResult = numbers.map((item, index, array) => item * 2);console.log(mapResult) // [2, 4, 6, 8, 10, 8, 6, 4, 2]; 
console.log(numbers)   // [1, 2, 3, 4, 5, 4, 3, 2, 1]; 

归并方法

ECMAScript 为数组提供了两个归并方法:reduce()reduceRight()

reduce()

let values = [1, 2, 3, 4, 5]; 
let sum = values.reduce((prev, cur, index, array) => prev + cur); 
console.log(sum); // 15

相关文章:

JavaScript高级程序设计读书分享之6章——6.2Array

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 除了 Object&#xff0c;Array 应该就是 ECMAScript 中最常用的类型了。 创建数组 使用 Array 构造函数 在使用 Array 构造函数时&#xff0c;也可以省略 new 操作符。 let colors new Array() let …...

MySQL递归查询 三种实现方式

1 建表脚本1.1 建表DROP TABLE IF EXISTS sys_region; CREATE TABLE sys_region (id int(50) NOT NULL AUTO_INCREMENT COMMENT 地区主键编号,name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 地区名称,short_name varchar(50) CHARA…...

Servle笔记(7):过滤器

1、过滤器的作用与目的 过滤器的目的 在客户端的请求访问后端资源之前&#xff0c;拦截请求在服务器的响应发送回客户端之前&#xff0c;处理响应 2、过滤器的类型 身份验证过滤器&#xff08;Authentication Filters&#xff09;数据压缩过滤器&#xff08;Data compressio…...

2023年:我成了半个外包

边线业务与主线角色被困外包&#xff1b; 012022年&#xff0c;最后一个工作日&#xff0c;裁员的小刀再次挥下&#xff1b; 商务区楼下又多了几个落寞的身影&#xff0c;办公室内又多了几头暴躁的灵魂&#xff1b; 随着裁员的结束&#xff0c;部门的人员结构简化到了极致&am…...

HTTP中GET与POST方法的区别

1. HTTP HTTP即超文本传输协议(Hyper Text Transfer Protocol)&#xff0c;是因特网上应用最广的一种协议。 设计目的&#xff1a;保证客户端与服务器之间的通信&#xff08;发布和接受HTML页面&#xff09;&#xff1b;工作方式&#xff1a;客户端-服务器端的请求-应答协议 …...

使用ChatGPT需要避免的8个错误

如果ChatGPT是未来世界为每个登上新大陆人发放的一把AK47&#xff0c; 那么现在大多数人做的事&#xff0c;就是突突突一阵扫射&#xff0c; 不管也不知道有没有扫射到自己想要的目标。每个人都在使用 ChatGPT。但几乎每个人都停留在新手模式。 避免下面常见的8个ChatGPT的错…...

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana&#xff0c;可以 1 搜索&#xff0c;观察和保护。 从发现文档到分析日志再到发现安全漏洞&#xff0c;Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…...

PPP点到点协议认证之PAP认证

PPP点到点协议认证之PAP认证 需求 如图配置接口的IP地址将R1配置为认证端&#xff0c;用户名和密码是 huawei/hcie &#xff0c;使用的认证方式是pap确保R1和R2之间可以互相ping通 拓扑图 配置思路 确保接口使用协议是PPP确保接口的IP地址配置正确在R1 的端口上&#xff0c…...

设计模式之建造者模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、建造者模式是什么&#xff1f; 建造者模式是一种创建型的软件设计模式&#xff0c;用于构造相对复杂的对象。 建造者模式可以…...

linux常见的系统日志

我们了解一下常见的系统日志&#xff0c;知道哪些需要收集 1. /var/log/boot.log linux中/var/log/boot.log是系统启动时的日志&#xff0c;其包括自启动服务。 2. /var/log/btmp linux中/var/log/btmp是记录登录失败信息的日志&#xff0c;是一种非文本文件&#xff0c;可以使…...

支付系统中的设计模式09:组合模式

现在就剩下怎么能够实现运营部提出的「打印出平台顾客购买的商品小票」这个需求了。 我们去超市买完东西之后,都会收到收银员打印出来的小票,就是商品清单、价格、数量和汇总的信息。下面这个我想应该99%的人都见过吧。 图三十七:超市购物小票 线上也是一样,也会有这种购物…...

Linux 文件权限之umask

目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容&#xff0c;涉及到的内容有&#xff1a;文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类&#xff1a;文件所有者、文件…...

SAP ABAP 理解RAWSTRING(XSTRING) 类型

用F1查看的时候&#xff0c;这里是这样说的&#xff1a; The types RAWSTRING and STRING have a variable length. A maximum length for these types can be specified, but has no upper limit. The type SSTRING is available as of release 6.10 and it has a variable …...

Linux核心技能:2023主流监控Prometheus详解,附官方可复制中文文档教程

Prometheus既是一个时序数据库&#xff0c;又是一个监控系统&#xff0c;更是一套完备的监控生态解决方案。作为时序数据库&#xff0c;目前Prometheus已超越了老牌的时序数据库OpenTSDB、Graphite、RRDtool、KairosDB等&#xff0c;如图所示。 &#xff08;来源网络&#xff0…...

金山文档这样玩,效率「狂飙」

1985年&#xff0c;微软发布了第一代的Excel。现在&#xff0c;Excel成为了许多打工人的必备工具&#xff0c;却也在很多人的日常工作中&#xff0c;带来了海量跨表同步、大批数据对齐的日常繁琐工作&#xff0c;逐渐沦为“表哥”“表妹”。多维表&#xff0c;是新一代数据效率…...

【类与对象】封装对象的初始化及清理

C面向对象的三大特性&#xff1a;封装、继承、多态。具有相同性质的对象&#xff0c;抽象为类。 文章目录1 封装1.1 封装的意义&#xff08;一&#xff09;1.2 封装的意义&#xff08;二&#xff09;1.3 struct 和 class区别1.4 成员属性设置为私有练习案例&#xff1a;1 设计…...

【算法】——并查集

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1.思想2.模板3.应用3.1 合并集合3.2 连通块中点的数量1.思想 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题…...

Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。

gif动图无损压缩1、引言2、代码实战2.1 模块介绍2.2 安装2.3 代码示例3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 求助~ 求助~ 求助~ 小鱼&#xff1a;你这是告诉我&#xff0c;重要的事情 说三遍吗&#xff1f; 小屌丝&#xff1a;你可以这么理解。 小鱼&#xff1a…...

文献阅读 An implementation of the seismic resolution enhancing network based on GAN

题目 An implementation of the seismic resolution enhancing network based on GAN 基于GAN的地震分辨率增强网络的实现 摘要 对于地震数据&#xff0c;本文利用深度学习来学习不同层次的特征并将它们合并以恢复缺失的分辨率。 将GAN网络引入到地震数据处理&#xff1b;对…...

Google员工说出了我不敢说的心里话!

前言&#xff1a;本文来自Beyond的投稿&#xff0c;码农翻身做了修改。今天在Medium上看到一篇文章《The maze is in the mouse》&#xff0c;是一个刚从Google离职的员工写的&#xff0c;揭开了Google内部的各种问题&#xff0c;引发了很多人的共鸣&#xff0c;到目前为止&…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...