js循环大全

  • Post author:
  • Post category:其他




1.while循环

var i = 1
while(i < 100 ) {
    console.log('i 当前为:' + i )
    i++
}



2.do-while循环

var x = 3
var y = 0
do {
    console.log(y)
    y++
} while(y<x)



3.for循环

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

var arrFor = [{name:'for1'},{name:'for2'},{name:'for3'},{name:'for4'},{name:'for5'}]
 for(var i=0,len=arrFor.length; i<len; i++){
     console.log(arrFor[i])
 }



4.foreach循环

遍历数组中的每一项,没有返回值,对原数组没有影响

var arrForeach =  [{name:'arrForeach1'},{name:'arrForeach2'},{name:'arrForeach3'},{name:'arrForeach4'},{name:'arrForeach5'}]
//1 没有返回值
//参数:value数组中的当前项, index当前项的索引, array原始数组;
//数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
arrForeach.forEach((item,index,array)=>{
   //执行代码
    console.log(item)
    console.log(index)
    console.log(array)
})



5.map循环

// 有返回值,可以return出来

// map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);

var ary = [12, 23, 24, 42, 1];
var res = ary.map(function (item, index, ary) {
    return item * 10;
})
console.log(res);//-->[120,230,240,420,10];  原数组拷贝了一份,并进行了修改
console.log(ary);//-->[12,23,24,42,1];  原数组并未发生变化



6.forof循环

可以正确响应break、continue和return语句

var arrForof = [{ name: 'forof1' }, { name: 'forof2' }, { name: 'forof3' }, { name: 'forof4' }, { name: 'forof5' }]
for (var value of arrForof) {
    console.log(value);
}



7.for…in循环

注意:for…in循环一般用于对象的遍历,但是这里有个坑需要注意

 // 任何对象都继承了Object对象,或者其他对象,继承的类的属性是默认不可遍历的,for...in循环遍历的时候会跳过,但是这个属性是
// 可以更改为可以遍历的,那么就会造成遍历到不属于自身的属性
var obj = {a: 1, b: 2, c: 3};
for(var i in obj) {
    console.log('键名:' , i)
    console.log('键值:' , obj[i])
}



8.filter循环



一、作用

  filter用于对数组进行过滤。
  它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
  注意:filter()不会对空数组进行检测、不会改变原始数组



二、语法

            Array.filter(function(currentValue, indedx, arr), thisValue)
            其中,函数 function 为必须,数组中的每个元素都会执行这个函数。且如果返回值为 true,则该元素被保留;

函数的第一个参数 currentValue 也为必须,代表当前元素的值。



三、实例

//返回数组nums中所有大于5的元素。
let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let res = nums.filter((num) => {
    return num > 5;
});
console.log(res);  // [6, 7, 8, 9, 10]



9.every循环



一、作用

every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。



二、语法

    Array.every(function(item, index, array), thisValue)
   其中,函数 function 为必须,数组中的每个元素都会执行这个函数。



三、实例

//判断数组中所有值是否大于5。
   var arr = [ 1, 2, 3, 4, 5, 6 ]; 
   console.log( arr.every( function( item, index, array ){ 
                        return item > 5; 
               })); 



10.some循环



一、作用

    some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。



二、语法

   Array.some(function(item, index, array), thisValue)
   其中,函数 function 为必须,数组中的每个元素都会执行这个函数。



三、实例

 // 判断数组中是否有值大于5。
 var arr = [ 1, 2, 3, 4, 5, 6 ]; 
 console.log( arr.some( function( item, index, array ){ 
         return item > 5; 
 })); 



11.reduce循环&&reduceRight循环



一、作用

reduce()方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

reduceRight()方法接收一个函数作为累加器(accumulator),数组中的每个值(从右到左)开始缩减,最终为一个值。



二、语法

          arr.reduce(function(prev,cur,index,arr){
           ...
           }, init);
           其中,
           arr 表示原数组;
           prev 表示上一次调用回调时的返回值,或者初始值 init;
           cur 表示当前正在处理的数组元素;
           index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
           init 表示初始值。



三、实例

var arr = [3,9,4,3,6,0,9];
//1. 求数组项之和
var sum = arr.reduce(function (prev, cur) {
    return prev + cur;
},0);
//由于传入了初始值0,所以开始时prev的值为0,cur的值为数组第一项3,
//相加之后返回值为3作为下一轮回调的prev值,然后再继续与下一个数组项相加,以此类推,直至完成所有数组项的和并返回。

// 2. 求数组项最大值
var arr = [3, 9, 4, 3, 6, 0, 9];
 var max = arr.reduce(function (prev, cur) {
      console.log('prev' + prev)
      console.log('cur' + cur)
      return Math.max(prev, cur);
 });
 console.log(max)
//由于未传入初始值,所以开始时prev的值为数组第一项3,cur的值为数组第二项9,取两值最大值后继续进入下一轮回调。

//3. 数组去重
var arr = ['123', '123', '123', '1243', '123', '123', '123'];
var newArr = arr.reduce(function (prev, cur) {
    console.log(prev)
    console.log(prev.indexOf(cur))
    prev.indexOf(cur) === -1 && prev.push(cur);
    return prev;
}, []);
console.log(newArr)

/**实现的基本原理如下:
1, 初始化一个空数组
2, 将需要去重处理的数组中的第1项在初始化数组中查找,如果找不到(空数组中肯定找不到),就将该项添加到初始化数组中
3, 将需要去重处理的数组中的第2项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
4, ……
5, 将需要去重处理的数组中的第n项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
6, 将这个初始化数组返回**/

//4.数组对象中的用法 <!-- 比如生成“老大、老二和老三” -->
const objArr = [{name: '老大'}, {name: '老二'}, {name: '老三'}];
const res = objArr.reduce((pre, cur, index, arr) => {
    if (index === 0) {
        return cur.name;
    }
    else if (index === (arr.length - 1)) {
        return pre + '和' + cur.name;
    }
    else {
        return pre + '、' + cur.name;
    }
}, '');
//5.求字符串中字母出现的次数
const str = 'sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha';
 const res = str.split('').reduce((accumulator, cur) => {
     console.log(accumulator)
     console.log(cur)
     accumulator[cur] ? accumulator[cur]++ : accumulator[cur] = 1;
     return accumulator;
 }, {});
 console.log(res)
 
//6.数组转数组 <!-- 按照一定的规则转成数组 -->
var arr1 = [2, 3, 4, 5, 6]; // 每个值的平方
var newarr = arr1.reduce((accumulator, cur) => {accumulator.push(cur * cur); return accumulator;}, []);

//7.数组转对象 <!-- 按照id 取出stream -->
var streams = [{name: '技术', id: 1}, {name: '设计', id: 2}];
var obj = streams.reduce((accumulator, cur) => {accumulator[cur.id] = cur; return accumulator;}, {});

//8.多维的叠加执行操作
// 各科成绩占比重不一样, 求结果 
var result = [
    { subject: 'math', score: 88 },
    { subject: 'chinese', score: 95 },
    { subject: 'english', score: 80 }
    ];
var dis = {
    math: 0.5,
    chinese: 0.3,
    english: 0.2
};
var res = result.reduce((accumulator, cur) => dis[cur.subject] * cur.score + accumulator, 0);
// 加大难度, 商品对应不同国家汇率不同,求总价格 
var prices = [{ price: 23 }, { price: 45 }, { price: 56 }];
var rates = {
    us: '6.5',
    eu: '7.5',
};
var initialState = { usTotal: 0, euTotal: 0 };
var res = prices.reduce((accumulator, cur1) => Object.keys(rates).reduce((prev2, cur2) => {
    console.log(accumulator, cur1, prev2, cur2);
    accumulator[`${cur2}Total`] += cur1.price * rates[cur2];
    return accumulator;
}, {}), initialState);
console.log(res)

var manageReducers = function () {
    return function (state, item) {
        return Object.keys(rates).reduce((nextState, key) => {
            state[`${key}Total`] += item.price * rates[key];
            return state;
        }, {});
    }
};
var res1 = prices.reduce(manageReducers(), initialState);
console.log(res1)

// 9.对象数组去重
var arr = [{ id: 1, name: 'bob' }, { id: 1, name: 'bob' }, 
{ id: 1, name: 'bob' }, { id: 1, name: 'lucy' },
{ id: 1, name: 'lucy' }, { id: 2, name: 'lucy' }, { id: 2, name: '张三' }]
var arr1 = arr.reduce(function (prev, element) {
   if (!prev.find(el => el.id == element.id)) {
       prev.push(element)
   }
   return prev
}, [])
console.log(arr)
console.log(arr1) 



四.重点总结:

reduce() 是数组的归并方法,与forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这一点是其他迭代方法无法企及的



12.find循环



一、作用

	find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined 



二、语法

function getStu(element){
   return element.name == '李四'
 }
 stu.find(getStu)
 stu.find((element) => (element.name == '李四'))



三、实例

var stu = [
	{
		name: '张三',
		gender: '男',
		age: 20
	},
	{
		name: '王小毛',
		gender: '男',
		age: 20
	},
	{
		name: '李四',
		gender: '男',
		age: 20
	}
	]
	function getStu(element){
		return element.name == '李四'
	}
	stu.find(getStu)
	stu.find((element) => (element.name == '李四'))



13.findIndex循环



一、作用

findIndex()对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1。



二、语法

[1,2,3].findIndex(function(x) { x == 2; });



三、实例

[1,2,3].findIndex(x => x == 4);



14.keys,values,entries循环



一、作用

     ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。



二、实例

for (let index of ['a', 'b'].keys()) {
	console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
 	console.log(elem);
 }
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
	console.log(index, elem);
}
// 0 "a"
// 1 "b"



版权声明:本文为wxl2454497677原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。