Array数组的方法

article/2025/10/12 2:48:26

1.Array.from()

将类数组结构转化为数组实例,

一参数是类数组对象即任何可迭代的结构,或者有一个length属性和可索引元素的结构

二参数是映射函数参数(可选)此函数可增强新函数的值,

三参数是指定映射函数中的this值(可选),但这个重写函数在箭头函数中不适用,

let rom ="echarts";Array.from(row) //['e', 'c', 'h', 'a', 'r', 's']let arr=[1,2,3,4];let a1=Array.from(arr,x=>x*2) //[2,4,6,8]let a2=Array.from(arr,function(x){return x*this.exponent},{exponent:2})//[2,4,6,8]

2.Array.of()

可以把一组参数转换为数组。替代es6之前的Array.prototype.slice.call(arguments)一种将arguments对象转换为数组的方法

Array.of(1,2,3) //[1,2,3]Array.of(undefined) //[undefined]

3.检测数组的方法

instanceofif(value instanceof Array){操作数组}isArrayif(Array.isArray(value)){操作数组}

instanceof的缺陷:使用instansof的问题假设只有一个全局执行上下文。如果网页里面有多个框架,则可能涉及两个不同的全局执行上下文,会有两个不同的版本的Array构造函数。如果要把数组从一个框架传给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组。

为了解决这个问题,提供了Array.isArray()方法。

4.检索数组内容的方法

keys(),values(),entries()

   let arr1=['foo','far','bar','quez'],console.log(arr1.keys()) //Array Iteratorconsole.log(arr1.values())  //Array Iteratorconsole.log(arr1.entries())  //Array Iterator   返回的都是迭代,需要转换console.log(Array.from(this.arr1.keys())) // [0, 1, 2, 3]
console.log(Array.from(this.arr1.values())) //['foo', 'far', 'bar', 'quez']
console.log(Array.from(this.arr1.entries())) //[[0,'foo'],[1,'far'],[2,'bar'],[3,'quez']]//虽然都是es6定义的,但是仍有浏览器没有实现他们

5.复制和填充方法

es6新增:copyWithin(),fill()

fill():向已有的数组插入全部或者部分相同的值

copyWithin():按照指定范围浅复制数组中的部分内容,将他们插入到指定索引开始的位置

//fill()
let arr =[1,2,3,4,5]//用5充填数组arr.fill(5) //[5,5,5,5,5]//用6充填,arr.fill(6,3) // [1,2,3,6,6]//用7充填arr.fill(7,1,3) //[1,7,7,4,5]//用8充填索引大于等于1且小于4的元素arr.fill(8,-4,-1) //[1,8,8,8,5]//copyWithin()let ints,reset=()=>ints=[0,1,2,3,4,5,6,7,8,9]reset()//从ints中复制索引0开始的内容,插入到索引5开始的位置
//在源索引或目标索引到达数组边界时为止ints.copyWithin(5)
console.log(ints) //[0,1,2,3,4,0,1,2,3,4] 会改变原数组
reset()//复制索引5开始的内容,插入到索引0开始的位置
ints.copyWithin(0,5)
console.log(ints) //[5,6,7,8,9,5,6,7,8,9]
reset()//复制索引0开始的内容,插入到索引3结束的位置 插入到索引4开始的位置ints.copyWithin(4,0,3)
console.log(ints) //[0,1,2,3,0,1,2,7,8,9]

6.栈方法

ecmascript为数组提供了几个方法,让他看起来像另外一种数据结构,数组可以像栈一样,显示插入和删除项的数据结构。

栈是一种后进先出(LIFO)的结构,最近添加的项先被删除,数据项的插入和删除只在栈一个地方发生,即栈顶。ecmascript数组提供了push()和pop()方法,以实现类似栈的行为。

push()接受任意参数,并添加到尾部,返回数组的length,

pop()则用于删除数组的最后一项,减少数组的length值,返回被删除的项,

let arr =[1,2,3]let count =arr.push('4','5')console.log(count) //[1,2,3,4,5]consolie.log(count.pop()) //5

7.队列方法

就像栈是以LIFO形式限制访问的数据结构一样,队列以先进先出(FIFO)形式限制访问,队列在列表尾部添加数据,在列表头部获取数据。push在数据末尾添加数据,

shift()和push()可以把数组当成队列来使用:
 

let colors = new Array();let count =colors.push('1','2')console.log(count)  // 1,2let item =colors.shift();console.log(item) // 1//push和shift组成正方向队列,unshift()和pop()组成反方向上队列

shift()方法模拟数组开头获取数据,它会删除数组的第一项并返回他,然后长度减1。

unshift()在数组开头添加任意多个值,然后返回新数组的长度

8.排序方法

reverse():将数组元素反向排列,不够灵活

sort():默认升序排列数组,sort在每一项调用String()转型函数,比较字符串来决定顺序,排序。

let value =[0,1,5,10,15]value.sort();console.log(value) //0,1,10,15,5

sort排序会出现这种意外,为此sort方法可以接收一个比较函数,用于判断哪个值应该在前面。

比较函数接受两个参数,如果第一个参数应该排第二个参数的前面,就返回负值,如果相等返回0,如果排在后面返回正值。

function compare(value1,alue2){if(value1<value2){return -1}else if(value1>value2){return 1}else{return 0}}let value =[0,1,5,10,15]value.sort(compare);console.log(value) //0,1,5,10,15

9.操作方法

concat()

可以在现有数组元素的基础上创建一个新数组。首先会创建一个副本,将它的参数添加到副本末尾,最后返回找个新构建的数组。

let colors =['red','green','blue'];let newColors=['black','brown'];let arr=newColors.concat(colors ) //['black','brown',['red','green','blue']]//数组打平//数组打平可以重写,方法是在参数数组上指定一个特殊符号:Symbol.isConcat-Spreadable.
//这个符号能阻止concat()打平参数数组,如果值为true,可以强制打平类数组对象。let colors =['red','green','blue'];let newColors=['black','brown'];let moreColors ={
[Symbol.isConcatSpreadable]:true,
length:2,
0:'pink',
1:'cyan'
};newColors[Symbol.isConcatSpreadable]=false,let arr2=colors.concat(newColors) //['red','green','blue',['black','brown']] //强制不打平let arr3=colors.concat(moreColors )//['red','green','blue','pink','cyan'] //强制打平

slice()

用于创建一个包含原有数组中的一个或多个元素的新数组。

可以接收一到两个参数:返回元素的开始索引和结束索引。

如果有一个参数,则slice()会返回该索引到数组末尾的所有元素。

如果有两个参数,则slice()会返回从开始索引到结束索引对应的所有元素,但是不包括结束索引对应的元素。这操作不影响原始数组。

let colors =['red','green','blue'];ler arr =colors.slice(1)//['green','blue'];let arr1=colors.slice(1,1) //['blue']

splice()

主要目的是在数组中插入元素,但有三种不同的方式使用这个方法:

删除:需要给splice()传入2个参数,要删除的第一个元素的位置和要删除的元素数量。可以从数组中删除任意多个元素,

插入:需要给splice()传3个参数,开始位置,0(要删除的数量)和要插入的元素,可以在数组指定位置插入元素。第三个参数之后还可以传第四个,第五个参数,乃至任意多个要插入的元素。

比如splice(2,0,'red','green')会在数组位置2开始插入字符串‘red’和‘green’

替换:splice()在删除元素的同时可以在指定位置插入新元素,同时传3个参数:开始位置,要删除元素的数量和要插入的任意多个元素。要插入的元素数量不一定跟删除的元素一致。

10,搜索和位置方法

严格相等

indexOf(),lastIndexOf()和includes()这些方法都接收两个参数,要查找的元素和一个可选的起始搜索位置,要使用===比较,也就是说两项必须严格相等。

indexOf()从数组开头搜索,返回数组的元素的位置,

lastIndexOf()从数组末尾搜索,返回数组元素的位置,

includes()从数组开头搜索,返回布尔值,

断言函数

断言函数的返回值决定了相应索引的元素是否被认为匹配。断言函数接收三个参数:元素,索引,数组本身。其中元素是当前搜索的元素,索引是当前元素的索引,数组是正在搜索的数组。断言函数返回真值,表示是否匹配。

find()和findIndex()方法使用了断言函数。

这两个方法都是从数组的最小索引开始的,find返回第一个匹配的元素,findIndex返回第一个匹配的元素的索引,这两个方法都接收第二个可选的参数,用于指定断言函数的内部的this的值。

11迭代方法

ECMAscript为数组定义了5个迭代方法。每个方法都接收两个参数:以每一项为参数运行的函数,以及可选的作为函数运行上下文的作用域对象(影响函数种this值)/传给每个方法的函数都接收3个参数:数组元素,元素索引和数组本身。

every():对数组每一项都运行传入的函数,如果对每项函数都返回true,则这个方法返回true。

filter():对数组每一项都运行传入的函数,函数返回true的项会组成数组后返回。

forEach():对数组每一项都运行传入的函数,没有返回值(undefined)

map():对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组(返回新数组)。

some():对数组每一项都运行传入的函数,如果有意向函数返回true,则这个方法返回true。

这些方法都不改变调用他们的数组。

let arr=[1,2,3,4,5,6,7,8,9]let result=arr.every((item,index,array)=>item>2)  //falselet result=arr.some((item,index,array)=>item>2) //trueler result=arr.filter((item,index,array)=>item>2) //[3,4,5,6,7,8,9]

12,归并方法

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

这两个方法都会迭代数组的所有项,并在此基础上构架一个最终返回值。reduce方法从数组的第一项开始遍历到数组的最后一项,而reduceRight相反。

这两个方法都接收两个参数:对每项都会运行的并归函数,以及可选的以之为并归起点的初始值。传给并归函数(reduce和reduceRight())接收4个参数:上一个并归值,当前项,当前项的索引和数组本身,这个函数的返回的任何值都会做为下一次调用同一个函数的第一个参数。如果没有给方法传入第二个参数,第一次迭代从数组的第二项开始,此时传入并归函数的第一个参数是数组的第一项,第二个参数是数组的第二项。

语法:数组.reduce(function(total, currentValue, currentIndex, arr), initialValue)

 

  {//reduce:累加let arr = [1, 2, 3, 4, 5]let sum = arr.reduce(function (val, item, index, arr) {return val + item}, 0)console.log(sum);let goods = [{name: "手机",num: 10,price: 500,ischecked: true},{name: "电脑",num: 20,price: 600,ischecked: false},{name: "ipad",num: 30,price: 700,ischecked: true},]/*let num=goods.reduce(function(val,item){if(item.ischecked){return val+item.num}else{return val}},0)console.log(num);*/let num = goods.reduce((val, item) => item.ischecked ? val + item.num : val, 0)let price = goods.reduce((val, item) => item.ischecked ? val + item.price * item.num : val, 0)/*let sum=0;arr.forEach(item=>{sum+=item})console.log(sum);*/}


http://chatgpt.dhexx.cn/article/Qo61K6rE.shtml

相关文章

常用处理数组的方法

常用处理数组的方法 一、Es5 1.Arr.map() 数组中的每个元素会执行一次回调函数&#xff0c;结果作为一个新的数组返回&#xff0c;不改变原数组let arr [1, 2, 3, 4, 5] let newArr arr.map(x > {return x*2 // 将数组的每一项乘以2 }) console.log(newArr) // [2, 4, …

JS数组常用方法整理(14种常用方法)

目录 1.增 1.1 push(): 1.2 unshift(): 2.删 2.1 pop(): 2.2 shift() 3.改&#xff08;增、删&#xff09;&#xff1a; 3.1 splice() 4.查 4.1 slice() 5.将数组转换为字符串&#xff1a; 5.1 toString() 5.2 join() 6.数组拼接 6.1concat() 7.检测数组中是否包…

总结: 数组常用的方法

在实际开发当中, 数组和对象使用到最多的; 数组和对象有很多的方法, 这里主要探讨一下: 数组的增删改查数组的排序方式数组转换成其他数据类型的方式ES6数组新增常用的迭代方式 为什么需要数组? 数组可以存入不限数的数据, 并且可以使用下标值进行访问; 数据在数组的内部是有…

hive 宽表变竖表 长表变宽表

1.这是源数据以及需要转化的目标表. 我们的方法是 , 用 GROUP BY按照year分组 , 并且依次提取1月,2月,3月,4月的 num,具体实现 1 2 3 4 5 6 select year, max(case when month1 then money else 0 end) as M1, max(case when month2 then money else 0 end) as M2, max(case w…

【pandas】变形(长宽表变换)

变形 长宽表的变形 长表变宽表就是一个分类变量的多个值展开成多个变量&#xff0c;和哑变量变换有点相似&#xff0c;但不是0-1编码而是其他变量的值。 宽表变长表类似&#xff0c;多个类别可以化在一个分类变量下。 pivot pivot是一种典型的长表变宽表的函数&#xff0c;…

数据库设计--大宽表

宽表的概念 基本概念 宽表从字面意义上讲就是字段比较多的数据库表。通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表。 由于把不同的内容都放在同一张表存储&#xff0c;宽表已经不符合三范式的模型设计规范&#xff0c;随之带来的主要坏处就是数据的大量冗…

Flink cdc+ doris 大宽表实践~

还没整理好&#xff0c;别慌。 一&#xff0c;业务问题&#xff1a; 多个表关联join&#xff08;涉及时间维度跨度很长&#xff09;&#xff0c;几乎等同于全量关联&#xff0c;这个时候flink sql join没法做&#xff0c;因为state会无线增大&#xff0c;然后OOM。 二&#xf…

实现MySQL同步数据到ES构建宽表

作者介绍 Ceven&#xff0c;德勤乐融(北京)科技有限公司 邮箱&#xff1a;likailindeqinyuerong.com 前言 CloudCanal 近期提供了自定义代码构建宽表能力&#xff0c;我们第一时间参与了该特性内测&#xff0c;效果不错。开发流程详见官方文档 《CloudCanal自定义代码实时加…

宽表:数据仓库 - “宽表”之争?

昨天在技术交流群里一个问题引发了激烈的讨论&#xff0c;我决定把它记录下来。 问题如下&#xff1a;DWD 中有宽表么&#xff1f; 作为扫盲文章&#xff0c;基础知识我们再普及一下&#xff0c;先介绍下基础相关概念。 数仓分层&#xff08;来自&#xff1a;个人理解&#xff…

Elasticseach:从微服务架构演变到大宽表思维的架构转变

序言 图示&#xff1a;Elasticsearch 在DB-Engine综合排名第8 Elasticsearch 简称"ES”, 在DB-Engine 综合排名第8&#xff0c;已经持续了相当长的时间&#xff0c;按照当下热度应该会继续保持或者上升一个名次&#xff1b;ES在多数工程师印象中最深刻可能是ELK三件套或者…

9.Flink实时项目之订单宽表

1.需求分析 订单是统计分析的重要的对象&#xff0c;围绕订单有很多的维度统计需求&#xff0c;比如用户、地区、商品、品类、品牌等等。为了之后统计计算更加方便&#xff0c;减少大表之间的关联&#xff0c;所以在实时计算过程中将围绕订单的相关数据整合成为一张订单的宽表…

数仓建模—宽表的设计

宽表的设计 高内聚低耦合 宽表是数仓里面非常重要的一块&#xff0c;数仓是分层的&#xff0c;这是技术进步和时代变化相结合的产物&#xff0c;数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发。 宽表主要出现在dwd 层和报表层&#xff0c;当然有的人说dws 层也有…

基于宽表的数据建模应用

一、业务背景 1.1 数据建模现状 互联网企业往往存在多个产品线&#xff0c;每天源源不断产出大量数据&#xff0c;这些数据服务于数据分析师、业务上的产品经理、运营、数据开发人员等各角色。为了满足这些角色的各种需求&#xff0c;业界传统数仓常采用的是经典分层模型的数…

数据仓库宽表

1. 构建宽表的目的 讲宽表我想从为什么需要宽表入手&#xff0c;而不是一上来就抠概念。因为我觉得一门知识叫什么名字并不是最核心的&#xff0c;关键是搞清楚它的诞生背景以及如何在特定场景用好它。 构建宽表的目的很简单,就是为了"一站式"尽可能多的展示我们需要…

宽表, 窄表, 维度表, 事实表的区别

在数据开发里, 会涉及到一些概念: 宽表, 窄表, 维度表, 事实表 宽表: 把多个维度的字段都放在一张表存储, 增加数据冗余是为了减少关联, 便于查询. 查询一张表就可以查出不同维度的多个字段窄表: 和我们 mysql 普通表三范式相同, 把相同维度的字段组成一张表, 表和表之间关联查…

[转]科普 | 什么是宽表?

科普 | 什么是宽表&#xff1f;一文带你了解 数据仓库宽表_数据宽表_吕归尘0的博客-CSDN博客 一、什么是“宽表”&#xff1f; “宽表”从字面上的意思就是字段&#xff08;列&#xff09;比较多的数据库表&#xff0c;是通过关联字段将多个业务主题相关的数据表进行挂接组装…

数仓建模,宽表是什么?如何设计?

数仓建模&#xff0c;宽表是什么&#xff1f;如何设计&#xff1f; 宽表的设计为什么要建设宽表宽表的好处和不足如何设计宽表总结 宽表的设计 其实宽表是数仓里面非常重要的一块&#xff0c;宽表主要出现在dwd 层和报表层&#xff0c;当然有的人说dws 层也有宽表&#xff0c;…

线性代数笔记22——特征值和特征向量

特征向量 函数通常作用在数字上&#xff0c;比如函数f作用在x上&#xff0c;结果得到了f(x)。在线性代数中&#xff0c;我们将x扩展到多维&#xff0c;对于Ax来说&#xff0c;矩阵A的作用就像一个函数&#xff0c;输入一个向量x&#xff0c;通过A的作用&#xff0c;得到向量Ax。…

特征值和特征向量意义

本文转载自https://blog.csdn.net/fuming2021118535/article/details/51339881&#xff0c;版权问题请联系博主删除 在刚开始学的特征值和特征向量的时候只是知道了定义和式子&#xff0c;并没有理解其内在的含义和应用&#xff0c;这段时间整理了相关的内容&#xff0c;跟大家…

特征值和特征向量的几何含义理解

在刚开始学的特征值和特征向量的时候只是知道了定义和式子&#xff0c;并没有理解其内在的含义和应用&#xff0c;这段时间整理了相关的内容&#xff0c;跟大家分享一下&#xff1b; 首先我们先把特征值和特征向量的定义复习一下&#xff1a; 定义&#xff1a; 设A是n阶矩阵&am…