JS中各种遍历方法

2019-01-28  本文已影响0人  守护银河的河童

数组遍历方法

使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。
1.能被break
2.会改变原数据
3.对象及数组都适用

    var arr = [
        {id:1,value:'yoy'},
        {id:2,value:'cher'},
        {id:3,value:'nothing'}
    ]
    for(var j = 0; j < arr.length; j++) {
        console.log(j,arr[j])
    }

最多可以接受三个参数的函数,ie8及以下不支持
1.有兼容问题(现在可忽略不计)
2.callback必填
3.仅适用数组
4.不能break,可以放进try模块

    var arr = [
        {id:1,value:'yoy'},
        {id:2,value:'cher'},
        {id:3,value:'nothing'}
    ]
    arr.forEach(function(v,key,arr){
        console.log(v,key,arr)
    })

forEach无法在所有元素都传递给调用的函数之前终止(而for循环却有break方法),如果要提前终止,必须把forEach放在try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止

function foreach(a,b,c){
  try{
    a.forEach(b,c);
  }catch(e){
    if(e===foreach.break)return;
   else throw e;
   }
  }
  foreach.break=new Error("StopIteration");
 }

有返回值,可以return出来,map的回调函数中支持return返回值;
map会根据index遍历,返回的新数组由return 后的表达式改变,
(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);
1.有兼容问题(现在可忽略不计),与forEach一致有三个参数
2.callback必填
3.仅适用数组

var arr = [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'}
]
var res = arr.map(function (item,index,ary ) { 
    return item.value='new'; 
}) 
console.log(res);//--> ["new", "new", "new"];  原数组拷贝了一份,并进行了修改
console.log(arr);//-->[ {id: 1, value: "new"},{id: 2, value: "new"},{id: 3, value: "new"}];  原数组并未发生变化

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
1.ie8及以下有兼容问题(现在可忽略不计)
2.filter() 不会对空数组进行检测
3.filter() 不会改变原始数组

var arr = [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'}
]

console.log(arr.filter(item => item.value = 'new')) //[{id: 1, value: "new"},{id: 2, value: "new"},{id: 3, value: "new"}]

for of 为es6的遍历方法
虽然for of 适用数组
1.有兼容问题
2.可以break ,continue,return
3.相比较 for循环,写法便捷
4.支持类似数组的对象,甚至字符串
5.不适用于处理原有的原生对象

var arr = [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'}
]
var str ='fdsagrewhfdadfwre'
for(let item of str){
    console.log(item) //f d s a g r e w h f d a d f w r e 
}
for(let item of arr){
    console.log(item) //{id: 1, value: "yoyo"}, {id: 2, value: "cher"}, {id: 3, value: "nothing"}
}

方法用于检测数组所有元素是否都符合指定条件
对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true
1.如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测
2.如果所有元素都满足条件,则返回 true
3.与字符串的indexOf方法相反用法,适用于数组。
4.ie8及以下不适用

var arr = [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'}
]
var res = arr.every(function(item,index,ary){
    return item.value !== 'uo'
    
})
console.log(res) // true

对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true
1.如果数组中检测到有一个元素满足,则整个表达式返回 true,且剩余的元素不会再进行检测
2.与字符串的indexOf方法类似用法,适用于数组。
3.ie8及以下不适用

var arr = [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'}
]

var res = arr.some(function(item,index,ary){
    return item.value == 'yoyo'
    
})
console.log(res) // true

接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
1.对于空数组是不会执行回调函数的
2.ie8及以下不适用
3.reduce接受一个函数,函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
 return previousValue + currentValue;
});

4.reduce还有第二个参数,我们可以把这个参数作为第一次调用callback时的第一个参数,上面这个例子因为没有第二个参数,所以直接从数组的第二项开始,如果我们给了第二个参数为5,那么结果就是这样的:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
 return previousValue + currentValue;
},5);

reduceRight()方法的功能和reduce()功能是一样的,不同的是reduceRight()从数组的末尾向前将数组中的数组项做累加。
reduceRight()首次调用回调函数callbackfn时,prevValue 和 curValue 可以是两个值之一。如果调用 reduceRight() 时提供了 initialValue 参数,则 prevValue 等于 initialValue,curValue 等于数组中的最后一个值。如果没有提供 initialValue 参数,则 prevValue 等于数组最后一个值, curValue 等于数组中倒数第二个值。

返回数组中符合测试函数条件的第一个元素。否则返回undefined
1.当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数
2.IE 11 及更早版本不支持 find() 方法
3.如果没有符合条件的元素返回 undefined
4.对于空数组,函数是不会执行的
5.并没有改变数组的原始值

var arr= [
    {id:1,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'},
]
var res = arr.find(function(item,index,ary){
    return item.value ==='yoyo'
})
console.log(res) //{id: 1, value: "yoyo"}

方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置
1.当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数
2.IE 11 及更早版本不支持 find() 方法
3.如果没有符合条件的元素返回 -1
4.findIndex() 对于空数组,函数是不会执行的。
5.findIndex() 并没有改变数组的原始值

ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
1.IE 11 及更早版本不支持 find() 方法
2.keys返回的是数组的index,不是键值对的key
3.values返回的是每项值
4.entries返回的是index 与值

var arr= [
    {id:9,value:'yoyo'},
    {id:2,value:'cher'},
    {id:3,value:'nothing'},
]
for (let index of arr.keys()) {
console.log(index);
}
// 0
// 1
// 2
for (let elem of arr.values()) {
console.log(elem);
}
// {id: 9, value: "yoyo"}
// {id: 2, value: "cher"}
// {id: 3, value: "nothing"}
for (let [index, elem] of arr.entries()) {
console.log(index, elem);
}
//0 {id: 9, value: "yoyo"}
//1 {id:2,value:'cher'}
//2 {id:3,value:'nothing'}

对象的遍历方法

其中for循环与数组中介绍的使用方法一致,以下只贴demo

var obj= {
    id:1,
    value:'yoyo',
    target:'js'
}
for (var item in obj){
    console.log(item)
}

这三个方法可以分别得到键名,值,重组为数组
建议配合for 方法使用,单独使用场景不多

var obj= {
    id:1,
    value:'yoyo',
    target:'js'
}
console.log(Object.keys(obj)) // ["id", "value", "target"]
console.log(Object.values(obj)) //[1, "yoyo", "js"]
console.log(Object.entries(obj)) // [["id", 1],["value", "yoyo"], ["target", "js"]]
console.log(...Object.entries(obj)) // ["id", 1],["value", "yoyo"], ["target", "js"]

其余遍历方法

只要指定条件为 true,循环就可以一直执行代码

while (i<5) 
  {
  x=x + "The number is " + i + "<br>";
  i++;
  }
do 
  {
  x=x + "The number is " + i + "<br>";
  i++;
  }
while (i<5);

do/while 循环是 while 循环的变体。
该循环至少会执行一次,即使条件是 false,隐藏代码块会在条件被测试前执行
别忘记增加条件中所用变量的值,否则循环永远不会结束

比起一开始的for循环,现在我们更多用的是含有迭代器的遍历方法,例如map、filter、包括keys、values、entries等等,我们写的更少,更简洁。

上一篇下一篇

猜你喜欢

热点阅读