js流程控制-循环方法汇总

206 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

在平时工作中,循环遍历操作是很常见的,在JS中 包括ES6,中都提供了很多针对循环的方法,本人结合具体方法的使用特进行如下的总结:

map()、filter()、find()、reduce()

map()根据数组获取一个映射的数组,返回新数组,不改变原数组。

    let goodsList = ['apple','pear','orange']
    let goods = goodList.map(good => {
      return superMarket.getGoods(good)
    })
     console.log(goodsList) //['apple','pear','orange']
     console.log(goods) //三个物品对象

filter()返回满足某一条件的数据,不改变原数组。

 let highBoys = boys.filter((boy)=> { 
    return boy.highy >= 180 
 } 
console.log(highBoys)    // [boy,boy,....]

find()返回满足条件的第一个, 不改变原数组。

let highBoy = boys.find((boy)=> { 
    return boy.high >= 180 
} 
console.log(highBoy)     // boy

reduce()对所有数组进行累加,最后返回一个值,不改变原数组。

let totalHight = boys.reduce((counetedHight,boy)=> { 
    return countedHigh + boy.hight 
});

for--in

总结:  for in 数组/对象都可以遍历,特别适合遍历对象。 其中 遍历对象,i对象的Key。 遍历数组i为数组的Index。

// 遍历 对象
const obj = { a: 1, b: 2, c: 3 }
for (let i in obj) { 
    console.log(i);   // 输出对象的key:  a  b  c 
};

// 遍历 数组
const arr = ['a', 'b', 'c'];
for (let i in arr) { 
    console.log(i)   // 输出: 0  1 2
//  注意:数组的下标index值是数字,for-in遍历的index值"0","1","2"等是字符串,所以不适合遍历数组。
};

const arr = ['a', 'b']      // 手动给 arr数组添加一个属性 
arr.name = 'qiqingfu'   // for in 循环可以遍历出 name 这个键名 
for (let i in arr) { 
    console.log(i)      //  输出数组的索引  a // b // name 
}

for--of

总结: for--of 相对来说,适合遍历数组。

  1. 其中的I表示的是item。
  2. for..of 循环可以随时退出循环。可以与 breakcontinuereturn配合使用。
  3. for..of 适用遍历数组/数组对象/字符串/map/set等 拥有迭代器对象的集合。 但是不能遍历对象,因为没有迭代器对象。
  4. for-of 循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法。
  5. 当你为对象添加myObject.toString()方法后,就可以将对象转化为字符串,同样地,当你向任意对象添加myObjectSymbol.iterator方法,就可以遍历这个对象了。
//遍历 对象
const obj = { a: 1, b: 2, c: 3 }
for (let i of obj) { 
    console.log(i)     //  Uncaught TypeError:  obj is not iterable 报错了; 
}

//遍历 数组
const arr = ['a', 'b', 'c'];
for (let i of arr) { 
    console.log(i)    // 输出数组的值:  a b c 
};
for (var key of Object.keys(someObject)) {
  console.log(key + ": " + someObject[key]);
}
  1. 遍历map对象时适合用解构,例如:
for (var [key, value] of phoneBookMap) {
   console.log(key + "'s phone number is: " + value);
}
const obj = { a: 1, b: 2, c: 3 } 
for (let i of Object.keys(obj)) { 
    console.log(i)      // 1  2  3 
 };

for of 循环

for (const iterator of list) {
        
}

for ( const [ key, value ] of map ) { 
    console.log( key, value );
}

================================
for( let [index,elem] of new Map( arr.map( ( item, i ) => [ i, item ] ) )){  
    console.log(index);  
    console.log(elem);}
}
//等价于:
let info=arr.map((item,i)=>{
   return  [i,item]
})
let tmpMap=new Map(info);

for (let [index,item] of tmpMap){
    console.log(index,item)
}

================================

for (const key in object) {
    if (object.hasOwnProperty(key)) {
        const element = object[key];

    }
}

遍历数组

1,普通for循环,经常用的数组遍历。

var arr = [1,2,0,3,9];
for ( var i = 0; i <arr.length; i++){
console.log(arr[i]);
}

2,优化版for循环: 使用变量,将长度缓存起来,避免重复获取长度,数组很大时优化效果明显。

for(var j = 0,len = arr.length; j < len; j++){
    console.log(arr[j]);
}

3,forEach,ES5推出的数组自带的循环,主要功能是遍历数组,实际性能比for还弱。

arr.forEach(function(value,i){
 console.log('forEach遍历:'+i+'--'+value);
})

forEach这种方法也有一个小缺陷:你不能使用break语句中断循环,也不能使用return语句返回到外层函数。

4, map遍历,map即是 “映射”的意思 用法与 forEach 相似

arr.map(function(value,index){
console.log('map遍历:'+index+'--'+value);
});

map遍历支持使用return语句,支持return返回值 

var temp=arr.map(function(val,index){
    console.log(val);
    return val*val
})
console.log(temp);

forEach、map都是ECMA5新增数组的方法,所以ie9以下的浏览器还不支持

5,for-of遍历是ES6新增功能

for( let i of arr){
    console.log(i);
};

for-of这个方法避开了for-in循环的所有缺陷 与forEach()不同的是,它可以正确响应breakcontinuereturn语句 

for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象 for-of循环也支持字符串遍历

ECMA 新方法

// Array.entries
// 该方法返回一个新的Array Iterator对象,该对象包含数组中每个索引对应的键/值对

var arr=["a","b","c","d",{name:"king"},false];
// 使用entries()
var  newArr=arr.entries();
// 方法一:
for(var item  of  newArr){
    console.log(item)   //输出一个数组[0,"a"];
}

for(var i=0;i<arr.length;i++){
   console.log(newArr.next().value// [1, "b"]
}

// keys() 和 values()  返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历;

for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0  1  输出的key;

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a' 'b'  输出的 value;

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"
// 输出 key,value 的数组;

while

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

//该循环至少会执行一次,即使条件是 false,隐藏代码块会在条件被测试前执行:
do{
    x=x + "The number is " + i + "<br>";
    i++;
}
while (i<5);

Vue中的 v-for 循环

<ul id="example-1">
    <li v-for="item in items">    <!-- <div  v-for="item of items"></div> -->
        {{ item.message }}
     </li>
</ul>

<ul id="example-2">
    <li v-for="(item, index) in items">
        {{ parentMessage }} - {{ index }} - {{ item.message }}
    </li>
</ul>

<script>
data: {
    items: [
        { message: 'Foo' },
        { message: 'Bar' }
    ]
}
</script>

<!-- 如果循环一个对象, 可以使用如下方式; -->
<ul id="v-for-object" class="demo">
    <li v-for="value in object">
        {{ value }}
    </li>
</ul>

<div v-for="(value, key) in object">
    {{ key }}: {{ value }}
</div>

<div v-for="(value, key, index) in object">
        {{ index }}. {{ key }}: {{ value }}
</div>

jQuery 中的 循环

现在JQuery,估计用的人也很少了,真是感叹呀!

$(selector).each(function(index,element){

});
 /**   
    function:每个匹配元素规定运行的函数。 
    index:选择器的 index 位置。
    element:当前的元素(也可使用 "this" 选择器)。
*/
$.each(dataResource,function(index,element){
    
}); 
/**
前者专用于jquery对象的遍历,后者可用于遍历任何的集合(无论是数组或是对象);
因为在JQuery中没有break和continue,非其关键字。
所以,JQuery each循环,要实现break和continue的功能,可以如下:
break   ----用return false;
continue --用return ture;
*/

find() 和some()

const students = [
    {
        name: 'Daniel',
        age: 22,
        country: 'Malaysia'
    },
    {
        name: 'Noob',
        age: 21,
        country: 'China'
    },
    {
        name: 'Coin',
        age: 17,
        country: 'Japan',
    }
];
// some  用來 檢查陣列裡面是否有一些符合條件。只要有一個以上符合條件就會回傳 true,全部都不是的話會回傳 false。

const result = students.some(x => x.age >= 18);
// 執行結果:result 為 true
const result2 = students.some(x => x.country === 'Singapore');
// 執行結果:result 為 false

// every  用来 检查 陣列裡面的所有東西都符合條件才會回傳 true,只要有一個不是就會回傳 false。

const result = students.every(x => x.age >= 18);
// 執行結果:result 為 false

someevery两个属性多用来做表单校验使用

1.比如表单所有元素的校验结果都为true,表单才能提交,使用 every

2.比如表单中通讯方式(电话、邮箱、微信、微博)中,最少有一个填写即可使用some