龙空技术网

JS中遍历原生数组和类数组对象的方法和解析

一米ymia 315

前言:

现时看官们对“js数组创建对象”都比较看重,小伙伴们都需要分析一些“js数组创建对象”的相关知识。那么小编在网络上网罗了一些有关“js数组创建对象””的相关内容,希望兄弟们能喜欢,同学们一起来学习一下吧!

Javascript具有用于遍历数组和类似数组的对象的强大语义。经过自我学习研究,本文将从两种类型来解说:数组、类数组的东西(例如arguments对象,其他可迭代对象(ES2015 +),DOM集合等)。

原生数组

ES5有三个选项 ForEach、For、For-In

ES2015+之后添加了两个选项for-of(隐式使用迭代器)、明确使用迭代器。

1.ForEach

var a = ["a", "b", "c"];a.forEach(function(entry) {    console.log(entry);});

forEach 这样做的好处是您不必在包含范围中声明索引和值变量,因为它们是作为迭代函数的参数提供的,因此可以很好地将作用域限定为该迭代。

forEach它是“遍历所有对象”功能,但是ES5定义了其他几个有用的“遍历数组并做事”功能,包括:

every(在第一次返回回调false或出现错误时停止循环)some(在第一次返回回调时停止循环true或发生错误)filter(创建一个新数组包含filter函数返回的元素)map (根据回调返回的值创建一个新数组)reduce (通过重复调用回调并传入先前的值来建立值)reduceRight(如reduce,按降序)

2.简单的for循环

var index;var a = ["a", "b", "c"];for (index = 0; index < a.length; ++index) {    console.log(a[index]);}

在ES2015及更高版本中,可以使索引和值变量在for循环本地

let a = ["a", "b", "c"];for (let index = 0; index < a.length; ++index) {    let value = a[index];    console.log(index, value);}

3.for-in

for-in遍历对象的可枚举属性,而不是数组的索引。注意:在ES2015(ES6)中不保证顺序(ES2020做到了)

var key;var a = [];a[0] = "a";a[10] = "b";a[10000] = "c";for (key in a) {    if (a.hasOwnProperty(key)  &&                 /^0$|^[1-9]\d*$/.test(key) &&             key <= 4294967294                        ) {        console.log(a[key]);    }}

需要注意:

遍历的对象具有自身的属性,而不是原型继承来的属性key是十进制数字key <= 2 ^ 32-2(即4,294,967,294)

4.for-of(隐式使用迭代器)(ES2015+)

const a = ["a", "b", "c"];for (const val of a) {    console.log(val);}

原理上,它是从数组中获取一个迭代器并循环遍历该数组。因为他使用了对象/数组的迭代器,所以不存在has的问题。与for-inES5不同,访问条目的顺序是其索引的数字顺序

5.显式使用迭代器(ES2015+)

const a = ["a", "b", "c"];const it = a.values();let entry;while (!(entry = it.next()).done) {    console.log(entry.value);}

支持三个返回迭代器的函数:keys()、values()、entries()

类数组对象

除了真正的数组之外,还有一些类数组对象,它们具有一个length或多个具有数字名称的属性,如NodeList实例,arguments对象等。我们如何遍历它们?

除了原生数组以上5种方法之外。

6.使用slice数组的方法

我们可以使用slice数组的方法,如下所示:

 var trueArray = Array.prototype.slice.call(arrayLikeObject);

我们要将NodeList转换为真实数组,则可以执行以下操作:

 var divs = Array.prototype.slice.call(document.querySelectorAll("div"));

7.使用扩展Spread语法(...)

可以使用ES2015的扩展语法,像一样for-of,它使用对象提供的迭代器

 var trueArray = [...iterableObject];

我们想将NodeList转换为真正的数组,使用扩展语法,这将变得非常容易:

 var divs = [...document.querySelectorAll("div")];

8.使用 Array.from

Array.from 由类似数组的对象创建数组,如:

 var divs = Array.from(document.querySelectorAll("div"));

您想获取具有给定类的元素的标签名称的数组,则可以使用函数:

 // 箭头函数 var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName); // 标准函数 var divs = Array.from(document.querySelectorAll(".some-class"), function(element) {     return element.tagName; });

补充

如果您使用的是jQuery库,则可以使用jQuery.each:

$.each(yourArray, function(index, value) {  // 你的代码});

标签: #js数组创建对象