重温JS——(数据系统内置功能)遍历器(for while forEach map filter some every reduce for of....)

目录

遍历器:

1、for

2、for in 循环

3、while循环

4、 do-while 循环

5、 Array  forEach 循环

6、Array map() 方法

7、Array filter() 方法

8、Array some() 方法

9、Array every() 方法

10、Array reduce() 方法

11、 Array reduceRight() 方法

12、for of 循环


遍历器:

取出数据容器中的每一个元素的工具

1、for

for 循环是 Js 中最常用的一个循环工具, 经常用于数组的循环遍历

for循环很重要也很常用,因为兼容性很好

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

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

2、for in 循环

for in 循环主要用于遍历普通对象, i 代表对象的 key 值, obj[i] 代表对应的 value。

当用它来遍历数组时候, 多数情况下也能达到同样的效果, 但一般不这么做, 这是有风险的。

 因为 i 输出为字符串形式, 而不是数组需要的数字下标, 这意味着在某些情况下, 会发生字符串运算, 导致数据错误, 比如: '52' +1 = '521' 而不是我们需要的 53。

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

            var obj = {
				name: 'zhou',
				age: '**'
			}
			for (var i in obj) {
                // console.log(i)   // name   age
				console.log(obj[i])   //zhou   **
			}


            var arr=[1,2,3]
			for (var i in arr) {
                console.log(i)   // 0 1 2
				console.log(arr[i])   // 1 2 3
			}

遍历对象的时候,不能写obj.i   因为i是字符串,而如果要点的话得是变量。所以只能用中括号

3、while循环

while 循环遍历数组

for和while 实现同样的效果, 事实上它们底层的处理是一样的。

不过for 循环可以把定义、 条件判断、 自增自减操作放到一个条件里执行, 代码看起来方便一些, 仅此而已。

先用for 循环方法

			let cars = ["BMW", "Volvo", "Saab", "Ford"];
			let i = 0;
			for (; cars[i];) {
				console.log(cars[i])
				i++;
			};  //BMW   dVolvo   Saab    Ford

while 循环方法

		cars = ["BMW", "Volvo", "Saab", "Ford"];
			var i = 0;
			while (cars[i]) {
				console.log(cars[i])
				i++;
			};   BMW   dVolvo   Saab    Ford

4、 do-while 循环

do-while 循环是while循环的一个变体, 它首先执行一次操作。

然后才进行条件判断, 是 true 的话再继续执行操作, 是 false 的话循环结束。

		    let i = 3;
			do {
				console.log(i)   //3 2 1
				i--;
			}
			while (i > 0)

5、 Array  forEach 循环

for  while 等等都是语句     而 forEach 是函数

forEach循环, 循环数组中每一个元素并采取操作, 没有返回值是undefined。 可以不用知道数组长度。   

他有三个参数, 只有第一个是必需的, 代表当前下标下的 value。第二个是index  第三个是arr。

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

传入的函数调用的次数=数组的length。每次调用会把数组中的元素传给回调函数

		    let arr = [1, 2, 3];
		 	var re=arr.forEach(function(i, index) {
				console.log(i, index)  //1 2 3   0 1 2
			})
            console.log(re)  //undefined

自定义 forEach 函数

            var arr=[1,2,3,4]
            Array.prototype.myforEach = function(callback) {
                for(var i=0;i<this.length;i++) {
                    callback(this[i])
                }
            }
            var re=arr.forEach(function(el){
                console.log(el)   //1 2 3 4 
            })

6、Array map() 方法

map() 方法返回一个新数组, 数组中的元素为原始数组元素调用函数处理后的值。

注意: map 和 forEach 方法都是只能用来遍历数组, 不能用来遍历普通对象。

有返回值(不写返回值,就返回一个数组,里面放的undefined)。

原数组不会改变,但是可以使用元素,操作返回值,就可以返回新的数组

            let arr = [1, 2, 3];
			let re = arr.map(function(i) {
				console.log(i)  //1 2 3
                return i*2
			})
            console.log(re)  // [2, 4, 6]
			console.log(arr)  //[1, 2, 3]

7、Array filter() 方法

filter 方法是 Array 对象内置方法, 它会返回通过过滤的元素, 不改变原来的数组。

			let arr = [1, 2, 3];
			let re = arr.filter(function(i,index,arr) {
				return i > 1;
			})
            console.log(re)  //[2,3]

8、Array some() 方法

some() 方法用于检测数组中的元素是否满足指定条件( 函数提供), 返回 boolean 值, 不改变原数组。      已经得到true,就不会在继续往后面检测了

			let arr = [1, 2, 3];
			let re = arr.some(function(i) {
				return i > 1;
			})
            console.log(re)  //true

 自定义 mysome 函数

            var arr=[1,2,400,4,800]
            Array.prototype.mysome=function(callback) {
                for(var i=0;i<this.length;i++) {
                    if(callback(this[i])) {
                        return true
                    }
                }
                    return false
                
            }
            var re=arr.mysome(function (el) {
                console.log(el)
                return el>200
            })
            console.log(re)

9、Array every() 方法

every() 方法用于检测数组所有元素是否 都 符合指定条件( 通过函数提供), 返回 boolean 值, 不改变原数组。

			let arr = [1, 2, 3];
			let re = arr.every(function(i) {
				return i > 1;
			})
            console.log(re)  //false

10、Array reduce() 方法

reduce() 方法接收一个函数作为累加器, 数组中的每个值( 从左到右) 开始缩减, 最终计算为一个值。  函数调用次数=数组元素个数-1

       var arr = [10, 20, 4, 5]
        var re = arr.reduce(function (n1, n2) {
            console.log(n1, n2) //第一次打印: 10 20  ,第二次:30 4
            return n1 + n2 //return是30 ,那就作为下一次的n1,一次类推。如果没有返回值,就为und
        })
        console.log(re) //最后一次return的结果,作为re的返回结果。39
		var arr=[10,20,4,5]
		var re=arr.reduce(function(n1,n2){
			console.log(n1,n2)
			return n1+n2
		},100)  //设置初始值,第一次调用时,n1是100,n2是20
		console.log(re)

11、 Array reduceRight() 方法

reduceRight() 方法, 和 reduce() 功能是一样的, 它是从数组的末尾处向前开始计算。

        var arr=[100,203,34,50]
		arr.reduceRight(function (n1,n2){
			console.log(n1,n2)				
		},0)  //n1是0,n2是50 倒着取
        // 0 50
        // undefined 34
        // undefined 203
        // undefined 100

12、for of 循环

 for of 循环是 Es6 中新增的语句, 用来替代 for in 和 forEach,

它允许你遍历 Arrays( 数组), Strings( 字符串), Maps( 映射), Sets( 集合) 等可迭代(Iterable data) 的数据结构, 注意它的兼容性。for of  可以遍历数组、类数组。

一般 for of和for in都不怎么用,推荐使用for循环

 for-in 是 Es5 中的技术。会取原型链上的

        var obj={age:20,name:"karen"}
        obj.__proto__={life:1}
        for(var key in obj) {
            console.log(key)  //age name  life
        }

 for of 循环是 Es6 中新增的语句,不取原型链上的,不可遍历对象

		var arr=[10,203,34]
		for (let s of arr) {
			console.log(s)   //10  203  34 
		}

算总价的三种方法:

 第1种:遍历数据 然后累加 for map for-in for-of foreach ...   一般用这个方法

 
		var arr=[10,203,4,5]
		var total=0;
		//for循环可以换为上面所学的map....那些方法
		for(var i=0;i<arr.length;i++){
			total+=arr[i]
		}
		console.log(total)

第2种:reduce   reduceRight()

var arr=[10,20,4,5]
		var re=arr.reduce(function(n1,n2){
			console.log(n1,n2)  //一次打印: 10 20  ,第二次:30 4
			return n1+n2  //return是30 ,那就作为下一次的n1,一次类推。如果没有返回值,就为und
		})
		console.log(re)  //最后一次return的结果,作为re的返回结果。39
 
 
var arr = [{
				title: "肉香肉丝",
				price: 18,
				count: 2
			},
			{
				title: "米饭",
				price: 1,
				count: 5
			},
			{
				title: "水煮肉片",
				price: 28,
				count: 1
			},
			{
				title: "鸡公煲",
				price: 20,
				count: 1
			}
		]
		//传初始值0的方法
		var re=arr.reduce(function(n1,n2){
			return n1+n2.price*n2.count
		},0)
		console.log(re)
 
		//不传初始值0
		var re=arr.reduce(function(n1,n2){
			if(!n1.total){
				n1.total=n1.price*n1.count+n2.price*n2.count
			}
			else{
				n1.total=n1.total+n2.price*n2.count
			}
			return n1
		})
		console.log(re)

 第3种  不建议(只有全是数字的时候才可以使用。影响性能)

 
		var arr=[10,203,4,5]
		var re=eval(arr.join("+"))
		console.log(re) 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值