js数组、对象遍历

905 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

前言

最开始常用的遍历 是for(var i=0;i<index,i++){},随着ctrl+v ,ctrl+c的技术不断提高,也开始使用for(let i in arr){}以及现在常用的arr.map((item,index)=>{}).

数组遍历常用方法

下边介绍数组中 常见的循环方法, 以及性能对比

for循环

`let arr = [1,2,3];`

for(let i=0; i<arr.length; i++){

console.log(i,arr[i])`

}

最简单的一种,也是使用频率最高的一种,但是还是有优化的空间

for(j = 0,len=arr.length; j < len; j++) { }

使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。

Array forEach 循环

let arr = [1,2,3];

arr.forEach(``function``(i,index){

    console.log(i,index)

})

// 1 0

// 2 1

// 3 2

使用频率较高,实际上性能比普通for循环弱. forEach循环,循环数组中每一个元素并采取操作, 没有返回值, 可以不用知道数组长度,他有三个参数,只有第一个是必需的,代表当前下标下的 value。

另外请注意,forEach 循环在所有元素调用完毕之前是不能停止的,它没有 break 语句,如果你必须要停止,可以尝试 try catch 语句,就是在要强制退出的时候,抛出一个 error 给 catch 捕捉到,然后在 catch 里面 return,这样就能中止循环了,如果你经常用这个方法,最好自定义一个这样的 forEach 函数在你的库里。

Array map()方法

let arr = [1,2,3];

let temp = arr.map((item,index)=>{
//item 第一个元素值  //index 为索引
})

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。虽然用起来比较优雅,但实际效率还比不上foreach

对象遍历

for in

let obj = {name:'liu',age:'je'}
for(let i in obj){
 console.log(i,obj[i])
}
// name liu
// age je

for in 循环主要用于遍历普通对象,i 代表对象的 key 值,obj[i] 代表对应的 value,当用它来遍历数组时候,多数情况下也能达到同样的效果,但是你不要这么做,这是有风险的,因为 i 输出为字符串形式,而不是数组需要的数字下标,这意味着在某些情况下,会发生字符串运算,导致数据错误,比如:'52'+1 = '521' 而不是我们需要的 53。

另外 for in 循环的时候,不仅遍历自身的属性,还会找到 prototype 上去,所以最好在循环体内加一个判断,就用 obj[i].hasOwnProperty(i),这样就避免遍历出太多不需要的属性。

for of(ES6新增)

ES6中,新增了for-of遍历方法。它被设计用来遍历各种类数组集合,例如DOM NodeList对象、Map和Set对象,甚至字符串也行。官方的说法是:

for...of语句在可迭代对象(包括 Array, Map, Set, String, TypedArray,arguments 对象等等)上创建一个迭代循环,对每个不同属性的属性值,调用一个自定义的有执行语句的迭代挂钩

// for-of遍历数组,不带索引,i即为数组元素

for (let  i of arrTmp){

     console.log(i)

}

//输出 "value1" "value2" "value3"

 

// for-of遍历Map对象

let  iterable =  new  Map([["a", 1], ["b", 2], ["c" , 3]]);`

for  ( let  [key, value] of iterable) {

   console.log(value);
}

//输出 1 2 3

 

// for-of遍历字符串

let  iterable =  "china中国" ;

for  ( let  value of iterable) {

   console.log(value);

}

//输出 "c" "h" "i" "n" "a" "中" "国"

Object.keys()方法(低版本IE不兼容)

/****Object.keys()返回键名数组****/

//数组类型

let  arr = ["a""b""c"];

console.log(Object.keys(arr));

// (3) ['0', '1', '2']

 

`// 类数组对象`

let  anObj = { 100` `'a'` `, 2` `'b'` `, 7` `'c'`  `};

console.log(Object.keys(anObj));

// (3) ['2', '7', '100']

 

//一般对象

let  xyz = {z"zzz" , x:  "xxx" , y:  "yyy"` };

console.log(Object.keys(xyz));

javascript原生遍历方法的建议用法:

  • 用for循环遍历数组
  • 用for-in遍历对象
  • 用for-of遍历类数组对象(ES6)
  • 用Object.keys()获取对象属性名的集合