doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

8c27aa8909c0c117e72effdaec9d4222.png

在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法?

本篇文章将从以下几个方面进行介绍:

  • Array.from()
  • Array.of()
  • fill()
  • includes()
  • find()&findIndex()
  • copyWithin()
  • entries(), keys()&values()

本篇文章预计10分钟

7d1c898339db0329ec74244fda626df8.png

Array.from()

Array.from()方法实现了把可迭代的对象(比如:Set,Map,Array)或类数组对象(一个拥有length属性且其它属性键值为数字的对象)转换成数组的功能。Array.from()语法定义如下:

Array.from(arrayLike[, mapFn[, thisArg]])

三个参数对应的含义如下:

  • arrayLike:类数组或可迭代的对象
  • mapFn:可选参数,回调函数实现元素迭代的功能(类似Map函数)
  • thisArg:可选参数,map函数中this属性指向这个对象。

接下来我们来看几个例子:

Map转换

其函数功能就是将Map对象转换成一个一位数组,类似[key1,value1,key2,value2,key3,value3.....],如下段代码所示

const map1 = new Map();map1.set('k1', '前');map1.set('k2', '端');map1.set('k3', '达');map1.set('k4', '人');console.log('%s', Array.from(map1))//outputs//k1,前,k2,端,k3,达,k4,人

Set转换

其函数功能将Set对象转换成一个一位数组,如下段代码所示:

const set1 = new Set();set1.add(1).add(2).add(3);console.log('%s', Array.from(set1));//outputs//1,2,3

字符串转换

其函数功能可以将一个字符串或unicode字符串转换成一个字符数组,如下段代码所示:

console.log('%s', Array.from('hello world'));console.log('%s', Array.from('前端达人'));//outputs//h,e,l,l,o, ,w,o,r,l,d//前,端,达,人

类数组对象转换

一个类数组对象必须有length属性,且它的属性名必须是数值或者可以转换成数值的字符。 注意:属性名代表了数组的索引号,如果没有这个索引号,转出来的数组中对应的元素就为空。

如下代码所示:

console.log('%s', Array.from({ 0: '0', 1: '1', 3: '3', length:4}));//outputs//0,1,,3

如果不带length属性,数组对象为空,如下段代码所示,没有任何输出:

console.log('%s', Array.from({ 0: 0, 1: 1}))

对象的属性名不能转换成索引号时,如下段代码所示,没有任何输出:

console.log('%s', Array.from({ a: '1', b: '2', length:2}));

mapFn函数转换

接下我们来看下如何使用map函数的使用,我们创建了一个接收可变参数的函数(arguments类数组对象),并返回一个针对参数处理过的数组,如下段代码所示:

function double(arr) { return Array.from(arguments, function(elem) { return elem * 2; });}const result = double(1, 2, 3, 4);console.log(result);//outputs//[ 2, 4, 6, 8 ]

第三个参数对象,mapFn函数的this指向

该参数是非常有用的,我们精彩会将被处理的数据和处理对象进行分离,将各种不同的处理数据的方法封装到不同的的对象中去,处理方法采用相同的名字。

在调用Array.from对数据对象进行转换时,可以将不同的处理对象按实际情况进行注入,以得到不同的结果,适合解耦。这种做法是模板设计模式的应用,有点类似于依赖注入。如下段代码所示:

let diObj = { handle: function(n){ return n + 2 }}console.log('%s', Array.from( [1, 2, 3, 4, 5],  function (x){ return this.handle(x) },  diObj))

处理Dom对象的应用

在实际开发过程中,我们经常会处理Dom对象,针对对象进行循环迭代处理,如下段所示:

const arr = document.querySelectorAll('div');/* arr.forEach( item => console.log(item.tagName) ) */ // => wrongArray.from(arr).forEach( item => console.log(item.tagName) ); // correct”

有上述代码我们看出,arr.forEach无法运行,是因为DOM对象是类数组对象,并非真实数组,我们需要使用Array.from()方法进行数组转换。

Array.of()

在ES6之前,我们使用 Array(...)方法声明一个数组,此方法接收一个参数,即此参数代表数组的长度而不是一个包含此数字的数组,声明后会构建一个此长度的空数组,有时候会产生难以发现的错误。因此ES6推出了Array.of()用于解决此问题,成为数组的推荐函数构造器。如下段代码代码所示:

let arr1 = Array(2);let arr2 = Array.of(1,2,3);console.log(arr1.length);console.log(arr1);console.log(arr2.length)console.log(arr2);

上述代码将会输出:

2[ <2 empty items> ]3[ 1, 2, 3 ]

由此可见使用 Array.of() 更能体现构建数组的意图,更清晰直白。

fill()

fill()函数用来将数值填充到指定的数组中,我们可以定义被填充数组的开始位置和结束位置,其使用语法定义如下:

Array.prototype.fill(value[, start[, end]])
  • value:要填充的数值,必填
  • start:填充的开始位置,选填
  • end:填充的结束位置,不包含此项,选填

注:如果只有value参数,即数组中所有的内容为此项;如果没有end参数,则其默认值为数组的长度;如果start或end为负数,其对应的值为当前数值+数组的长度

为了更好理解此函数,我们先来一段代码,如下所示:

let arr1 = [1, 2, 3, 4];let arr2 = [1, 2, 3, 4];let arr3 = [1, 2, 3, 4];let arr4 = [1, 2, 3, 4];let arr5 = [1, 2, 3, 4];arr1.fill(5);arr2.fill(5, 1, 2);arr3.fill(5, 1, 3);arr4.fill(5, -3, 2);arr5.fill(5, 0, -2);console.log(arr1);console.log(arr2);console.log(arr3);console.log(arr4);console.log(arr5);

上述代码将会输出:

[ 5, 5, 5, 5 ][ 1, 5, 3, 4 ][ 1, 5, 5, 4 ][ 1, 5, 3, 4 ][ 5, 5, 3, 4 ]

includes()

includes()方法用来判断数组中是否含有某元素,如果存在返回true,不存在返回false,如下段代码所示:

const arr = [0, 1, 1, 2, 3, 5, 8, 13];arr.includes(0); // truearr.includes(13); // truearr.includes(21); // false

与indexOf()方法的区别

indexof()方法用来判断数组中是否含有某元素,但是返回结果是此元素在数组的索引位置,如果不存在则返回-1,如下段代码所示:

const arr = ['apple', 'mango', 'banana'];console.log(arr.indexOf('前端达人')); // -1console.log(arr.indexOf('apple')); // 0console.log(arr.indexOf('mango')); // 1console.log(arr.indexOf('apple') >= 0); // true console.log(arr.includes('apple')); // true console.log(arr.indexOf('pineapple') >= 0); // false console.log(arr.includes('pineapple')); // false

如果你还要问还有什么区别,还有一个不太常用的关于NaN的判断,示例代码如下:

const arr = ['Some elements I like', NaN, 1337, true, false, 0017];console.log(arr.includes(NaN)); // trueconsole.log(arr.indexOf(NaN) >= 0); // false

因为index.of()的使用严格匹配(===)进行判断,我们可以使用console.log(NaN===NaN)进行确认,运行结果为false。

find()&findIndex()

find()

find()函数用来在数组中查找目标元素,找到就返回该元素(找到一个即可,不再寻找其它),找不到返回undefined。其语法定义如下:

arr.find(callback[, thisArg]);
  • callback:回调的函数
  • thisArg:执行回调函数时的this指向,可选

在callback回调函数上一共有三个参数:

  • 每一次迭代查找的数组元素
  • 每一次迭代查找的数组元素索引
  • 被查找的数组

为了更好的理解这个函数,我们来看如下代码,示例如下:

const arr = [1, 2, 3, 4];const result = arr.find(function(elem) { return elem > 2; });console.log(result);//ourputs//3

上述输出结果只返还了一项,其实满足条件的有两项,但是find函数的功能,只要找到一项内容就返回。

findIndex()

findIndex()和find()类似,差别就是返回该元素在数组中对应的索引,只返回最先满足条件的元素的索引。如下段代码所示:

const arr = [1, 3, 4, 5];const result = arr.findIndex(function(elem) {return elem > 3;});console.log(result);//outputs//2

数组中满足大于3的元素有4,5两项,由于此函数只返还最先满足大于3的元素的索引,元素4的索引为2,因此返回2。

copyWithin()

copyWithin()方法浅复制数组的一部分到同一数组中的另一个位置,覆盖这个位置所有原来的值,并返回它,不会改变原数组的长度。其语法定义如下:

arr.copyWithin(target[, start[, end]])
  • target:在当前数组,定义要从什么位置开始复制的索引。如果数值大于等于数组长度,数组不会进行拷贝,保持原样。
  • start: 在当前数组,选取要复制的数组内容的起始索引,如果为负值,对应的值则为当前值+数组的长度
  • end:在当前数组,选取要复制的数组内容的结束索引,不包含此项内容。如果为负值,对应的值则为当前值+数组的长度,此参数可选。如果没提供,其值默认为数组的长度

注:索引从0开始

为了更好的理解此方法,笔者用下图进行示意:

94d9809f565390c35892ca21f0e0fb18.png

接下来为了理解这些参数,我们来看一段代码,示例代码如下:

const arr1 = [1, 2, 3, 4, 5];const arr2 = [1, 2, 3, 4, 5];const arr3 = [1, 2, 3, 4, 5];const arr4 = [1, 2, 3, 4, 5];arr1.copyWithin(1, 2, 4);arr2.copyWithin(0, 1);arr3.copyWithin(1, -2);arr4.copyWithin(1, -2, -1);console.log(arr1);console.log(arr2);console.log(arr3);console.log(arr4);

上述代码的输出结果:

[1,3,4,4,5][2,3,4,5,5][1,4,5,4,5][1,4,3,4,5]

entries(), keys()&values()

entries()方法返回一个Array Iterator对象,该对象包含数组中每个索引的键/值对,类似[key1,value1,key2,value2,key3,value3.....]

keys()方法返回一个包含数组中每个索引键的Array Iterator对象。

values()方法返回一个新的 Array Iterator 对象,该对象包含数组每个索引的值。 注意:使用这些方法返回的是可迭代的Array Iterator对象而不是数组。

const arr = ['a', 'b', 'c'];const entries = arr.entries();const keys = arr.keys();const values = arr.values();console.log(...entries);console.log(...keys);console.log(...values);

上述代码输出结果:

0,a 1,b 2,c0 1 2a b c

小节

5454594476aace616eb725d721753d07.png

由于内容篇幅有限,今天的文章就介绍到这里,下篇文章笔者将继续介绍Array数组迭代的新方法——map(),filter(),forEach(),some(),reduce()等,敬请期待。

更多精彩内容,请微信关注“前端达人”公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No module named ‘__main__.common‘; ‘__main__‘ is not a package

今天在调通代码时遇到一个难缠的bug,源代码如下&#xff1a; from .common import _FLOATX, _EPSILON结果报错&#xff1a; 问题原因&#xff1a; 也就是说&#xff0c;这是相对导入&#xff0c;只有在父模块在当前运行环境中被导入过才能用。 这揭示了报错的缘由&#xff0…

ValueError( Shape(4, ?, 1, 20) and () are incompatible

报错&#xff1a; 解决&#xff1a; 将文件中的return tf.concat(axis, tensors) 改为&#xff1a;return tf.concat(tensors, axis)问题完美解决

adadelta算法_对C++用户比较友好的机器学习算法库

由于疫情影响&#xff0c;这几天在家学习编程&#xff0c;整理了基于c语言的机器学习算法库。目前大部分机器学习库都是面向pyhton语言的&#xff0c;尽管很python包的底层语言是c&#xff0c;但c用户使用起来很麻烦&#xff0c;这里整理了一些对c比较优化的机器学习算法库&…

不解析,使用解析对象

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 &#xff0c;这些对象在外出之前先序列化为JSON&#xff0c;然后在返回时反序列化。 这种方法很流行&#xff0c;而且是错误的。 序列化部分应该由打印机代替&#xff0c;我在前面已经解释过。 这是我对反序列化的…

yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘

添加一下命令即可&#xff1a; 我的操作&#xff1a; return yaml.load(config)改为 return yaml.full_load(config)问题完美解决

3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点

1、戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图&#xff1a;戒指手寸内直径大小说明图1、戒指手寸规格有14号、15号、16号、17号、18号、19号、20号、&#xff0c;但是从开发角度来说比较常见规格是17号18号19号这几种规格比较多&#xff0c;那我们电脑3D建模的时…

微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?

嘿&#xff0c;胖友们大家好呀&#xff0c;我是三儿。又是精(bu)神(xiang)满(shang)满(ban)的周一啦&#xff0c;胖友们准备好开始迎接新的一周了吗&#xff01;为了迎接这个崭新的周一&#xff0c;三儿特意为你们准备的一些实用的小工具教学&#xff0c;帮助你们快速的完成工作…

latex学习篇【一】论文中的图片技巧QA

第一篇论文总算收尾了&#xff0c;整理一波latex写论文的Q&A。 LATEX专栏第一篇&#xff1a;在Latex模板中引入各种图片的问题。 工具&#xff1a;overleaf网站&#xff1a;https://www.overleaf.com/project/60e9ceb20f8db14efa31dc80在overleaf上面插入图片什么形式最好…

LATEX学习篇【二】:论文中的公式技巧QA

写论文免不了写好多好多公式&#xff0c;众所周知啊latex的公式是很难编辑的&#xff0c;有没有简便一点的办法呢&#xff1f;有的&#xff0c;让我们继续读下去吧&#xff01; 写公式时会用到的一些奇奇怪怪的符号大全&#xff08;来自百度&#xff09; 2. 写公式好用的工具…

使用RabbitMQ的SpringBoot消息传递

RabbitMQ是流行的消息代理解决方案之一&#xff0c;并提供可用于各种编程语言的客户端库&#xff0c;包括Java&#xff0c;Scala&#xff0c;.NET&#xff0c;Go&#xff0c;Python&#xff0c;Ruby&#xff0c;PHP等。在本教程中&#xff0c;我们将学习如何使用RabbitMQ消息代…

1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举

1.0jpa 2.0如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL…

矩形脉冲信号的_IQ信号的解调学习

前面的文章学习了IQ的调制&#xff0c;本文主要讨论IQ的解调过程。调制波形回顾IQ的shifted DQPSK的调制波形总结如下。IQ的星图映射波形每个symbol有256个采样点&#xff0c;这里可以用单位脉冲或者矩形脉冲。如果只看256个symbol的话&#xff1a;IQ经过FIR滤波之后&#xff0…

Spring Data MongoDB教程

在当今世界&#xff0c;尽快启动并运行应用程序非常重要。 该应用程序还应该易于开发和维护。 Spring是这样的框架&#xff0c;它提供了与许多不同框架的集成的简便性&#xff0c;这使得使用Spring开发应用程序变得容易。 一种这样的集成是Spring与MongoDB的集成。 1.简介 在…

arm 交叉编译找不到so_嵌入式杂谈之交叉编译

这次扯一下嵌入式开发过程中经常用到的交叉编译器&#xff0c;虽说在之前的文章也提到过这个问题&#xff0c;不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来&#xff0c;慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法)&#xff…

Java 10将如何改变您的编码方式

突出显示Java 10中新的Java局部变量类型推断功能 早在2016年&#xff0c;Java社区就掀起了新的JDK增强提案&#xff08;JEP&#xff09;&#xff1a; JEP 286 。 现在&#xff0c;两年后&#xff0c;局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员…

中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)

蒲公英路由器是由上海贝锐信息科技股份有限公司(oray)在2015年10月14日推出的一款路由器。它是一款采用VPC[3]技术实现智能组网的路由器。2台或多台使用&#xff0c;无需公网IP&#xff0c;能将异地局域网通过蒲公英组建成一个网络。这次刷固件的教程为蒲公英路由器x3/x3pro刷第…

Spring Cloud Netflix尤里卡

本教程是关于Spring云Netflix Eureka的。 在这里&#xff0c;我们将创建eureka发现服务器和微服务&#xff0c;这些服务本身将注册到发现服务器和使用netflix客户端API的客户端中&#xff0c;以使用示例示例来发现服务并使用该服务公开的微服务。因此&#xff0c;我们将开发每个…

掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进

注&#xff1a;以下内容来自于网络,若有侵权请联系QQ3609400292进行删除。煤矿安全生产标准化管理体系基本要求及评分方法(试行)8.4 掘 进一、工作要求(风险管控)1.生产组织(1)煤巷、半煤岩巷宜采用综合机械化掘进&#xff0c;综合机械化程度不低于50%&#xff0c;并持续提…

hide show vue 动画_jQuery动画效果

-------------------------------------------------------------------------------------------------------1. 隐藏和显示show()方法和hide()方法是jQuery中最基本的动画方法。在HTML文档里&#xff0c;为一个元素调用hide()方法&#xff0c;会将该元素的display样式改为“n…

润乾报表分组求和_一招搞定各种报表合计需求

一、常用合计方案在有专业报表工具之前&#xff0c;常用的实现方案有&#xff1a;1&#xff09; SQL“select sum(字段) from 表 group by 字段 order by 字段“可以实现简单的分组数据合计、条件合计&#xff0c;这种方式有一个很明显的缺点&#xff0c;就是随着合计需求复杂度…