vue foreach 循环数据
vue 2017-11-16 10:07:51

forEach方法使用:

ES6写法,除抛出异常可中断外,不可使用break,continue等方法

JavaScript Code复制内容到剪贴板
  1. let listItems = this.tagList;//定义需要循环的数据  
  2.   
  3. listItems.forEach(function(item) {  
  4.     console.log(item.tagName);  
  5. });  

 

JavaScript Code复制内容到剪贴板
  1. Array.forEach(element => {  
  2.     console.log(element.publishId);  
  3. });  

 

改为箭头函数

JavaScript Code复制内容到剪贴板
  1. Array.forEach((item,index) =>{  
  2.   
  3. });  

 

 

JavaScript Code复制内容到剪贴板
  1. var ary = ["JavaScript""Java""CoffeeScript""TypeScript"];  
  2.   
  3. ary.forEach(function(value, index, _ary) {  
  4.     console.log(index + ": " + value);  
  5.     return false;  
  6. });  

 

 

循环后,组成新数组:

JavaScript Code复制内容到剪贴板
  1. import Vue from 'vue'  
  2.   
  3.   
  4. let listItems = this.tagList;//定义需要循环的数据  
  5. let newItems = [];    
  6.     
  7. listItems.forEach(function(item) {    
  8.     newItems.push({"label":item.lessonName,"value":item.lessonName});   
  9. });    
  10.   
  11. console.log(newItems); //打印新的数组  
  12.   
  13. Vue.set(this,"selectedLessonList", selectedLessonList); // 重新渲染循环的dom  

 

如果Vue.set还是不生效,那只能强制更新

JavaScript Code复制内容到剪贴板
  1. this.$forceUpdate();  

 

 

foreach输出索引/下标:

JavaScript Code复制内容到剪贴板
  1. this.lists.forEach((item,index) => {  
  2.   ...  
  3. })  

 

在数组中作匹配:

JavaScript Code复制内容到剪贴板
  1. this.tagList.forEach(function(item,index) {  
  2.     if(tags.indexOf(item.tagName) !== -1){  
  3.         Vue.set(that.tagList[index], 'isA'true);  
  4.     }  
  5. });  

 

查询在指定数组中,是否含有指定值,如果有,则删除它

在列表中作绑定:

XML/HTML Code复制内容到剪贴板
  1. <!--v-show  这里的show字段可以不用在数组中存在,默认是空(undefined) -->  
  2. <div class="class-item clear" v-for="item in teachPlanLibrary" v-show="!item.show">{{item.planName}}</div>  

 

多选删除:

JavaScript Code复制内容到剪贴板
  1. let vm = this;  
  2. // 删除教学计划  
  3. if(!this.selectedPlanIds.length) {  
  4.     this.$toast("请先勾选要删除的计划");  
  5.     return false;  
  6. }  
  7.   
  8. //teachPlanLibrary是在模板中渲染的时候用的  
  9.   
  10.             this.selectedPlanIds.forEach(function(item) {    
  11.                 vm.removeByValue(vm.teachPlanLibrary,item);  
  12.             });  

 

for循环,使用break可跳出循环:

PHP Code复制内容到剪贴板
  1. removeByValue(arr, val) {  
  2.     let vm = this;  
  3.     // 查询value中是否有这个值,如果有就去除这个数组    
  4.     for(var i = 0; i < arr.length; i++) {  
  5.         //这里要注册是在匹配数组中的哪个值,这里的情况是planId  
  6.         if(arr[i].planId == val) {   
  7.             vm.$set(arr[i], 'show', true);  
  8.             break;    
  9.         }    
  10.     }    
  11. },    

 

foreach给数组增加键值对:

JavaScript Code复制内容到剪贴板
  1. let vm = this;  
  2.                     let data = JSON.parse(res.data.gsonStr); // 返回的结果数组      
  3.                     let total = res.data.tot; // 返回的总条数      
  4.                     //                                              console.log(data);  
  5.                     if(data){  
  6.                         for(var i = 0; i < data.length; i++) {  
  7.                             let item = data[i];  
  8.                             let timeStatus = vm.global.getStatusByTime(item.startTime,item.endTime); //是否开始状态  
  9.                             let timeStatusTxt = vm.global.getStatusByTimeShowTxt(timeStatus); //是否开始状态文字  
  10.                             let publishTypeTxt = vm.global.getPublishType(item.publishType); //类型  
  11.                             let statusTxt = vm.global.getPublishStatus(item.status);//草稿、未审核、已审核  
  12.                             vm.$set(item, 'statusTxt', statusTxt);  
  13.                             vm.$set(item, 'publishTypeTxt', publishTypeTxt);  
  14.                             vm.$set(item, 'timeStatus', timeStatus);  
  15.                             vm.$set(item, 'timeStatusTxt', timeStatusTxt);  
  16.                        };  
  17.                     }  

 

for循环如果是多层循环 可以将循环命名,跳出指定的循环。

JavaScript Code复制内容到剪贴板
  1. first://需要将循环命名  
  2.  for(var i=0;i<10;i++){  
  3.    for(var j=0;j<5;j++){  
  4.         if(i==3 && j==4){  
  5.            break first;//跳出循环first  
  6.         }  
  7.    }  
  8.  }  

 

forEach 如果要提前终止

需要将forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止:

JavaScript Code复制内容到剪贴板
  1. var myerror = null;  
  2.              try{  
  3.                  arr.forEach(function(el,index){  
  4.                      if (el==20) {  
  5.                          console.log("try中遇到20,能退出吗?");//  
  6.                          foreach.break=new Error("StopIteration");  
  7.                      }else{  
  8.                          console.log(el);  
  9.                      }  
  10.                  });  
  11.              }catch(e){  
  12.                  console.log(e.message);  
  13.                  if(e.message==="foreach is not defined") {  
  14.                      console.log("跳出来了?");//  
  15.                      return;  
  16.                  }else throw e;  
  17.              }//可以跳出来  

 

 不规则数据循环:

JavaScript Code复制内容到剪贴板
  1. var arr = [4, 6, 9, 1, 20, 11];  
  2.   
  3. $.each(arr, function(i, elem) {  
  4.     if(i != 0) {  
  5.         console.log(i, elem);  
  6.     }  
  7. })  

 


 

对象遍历

1、for in 

JavaScript Code复制内容到剪贴板
  1. for (let key in obj) {  
  2.  console.log(obj[key]) // foo, bar  
  3. }  

 

可以看到对象原型上的属性也被循环出来了,在这种情况下可以使用对象的 hasOwnProperty() 方法过滤掉原型链上的属性

JavaScript Code复制内容到剪贴板
  1. for (let key in obj) {  
  2.  if (obj.hasOwnProperty(key)) {  
  3.   console.log(obj[key]) // foo  
  4.  }  
  5. }  

 

这时候原型上的 bar 属性就被过滤掉了

 

2、Object.keys

Object.keys() 是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,它会自动过滤掉原型链上的属性,然后可以通过数组的 forEach() 方法来遍历

JavaScript Code复制内容到剪贴板
  1. Object.keys(obj).forEach((key) => {  
  2.  console.log(obj[key]) // foo  
  3. })  

另外还有 Object.values() 方法和 Object.entries() 方法,这两方法的作用范围和 Object.keys() 方法类似,因此不再说明

for in 循环和 Object.keys() 方法都不会返回对象的不可枚举属性

如果需要遍历不可枚举的属性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了

 

3、Object.getOwnPropertyNames

Object.getOwnPropertyNames() 也是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性,也可以通过数组的 forEach 方法来遍历

JavaScript Code复制内容到剪贴板
  1. // 创建一个对象并指定其原型,bar 为原型上的属性  
  2. // baz 为对象自身的属性并且不可枚举  
  3. const obj = Object.create({  
  4.  bar: 'bar'  
  5. }, {  
  6.  baz: {  
  7.   value: 'baz',  
  8.   enumerable: false  
  9.  }  
  10. })  
  11.    
  12. obj.foo = 'foo'  

 

// 不包括不可枚举的 baz 属性

JavaScript Code复制内容到剪贴板
  1. Object.keys(obj).forEach((key) => {  
  2.  console.log(obj[key]) // foo  
  3. })  

 

// 包括不可枚举的 baz 属性

JavaScript Code复制内容到剪贴板
  1. Object.getOwnPropertyNames(obj).forEach((key) => {    
  2.     console.log(obj[key]) // baz, foo   
  3. })  

 

ES2015 新增了 Symbol 数据类型,该类型可以作为对象的键,针对该类型 ES2015 同样新增Object.getOwnPropertySymbols() 方法

 

4、Object.getOwnPropertySymbols

Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性

JavaScript Code复制内容到剪贴板
  1. Object.getOwnPropertySymbols(obj).forEach((key) => {  
  2.  console.log(obj[key])  
  3. })  

什么都没有,因为该对象还没有 Symbol 属性

// 给对象添加一个不可枚举的 Symbol 属性

JavaScript Code复制内容到剪贴板
  1. Object.defineProperties(obj, {    
  2.     [Symbol('baz')]: {     
  3.         value: 'Symbol baz',     
  4.         enumerable: false    
  5.     }   
  6. })  
  7.   
  8.   
  9. // 给对象添加一个可枚举的 Symbol 属性  
  10. obj[Symbol('foo')] = 'Symbol foo'  
  11.    
  12. Object.getOwnPropertySymbols(obj).forEach((key) => {  
  13.  console.log(obj[key]) // Symbol baz, Symbol foo  
  14. })  

 

5、Reflect.ownKeys

Reflect.ownKeys() 方法是 ES2015 新增的静态方法,该方法返回对象自身所有属性名组成的数组,包括不可枚举的属性和 Symbol 属性

JavaScript Code复制内容到剪贴板
  1. Reflect.ownKeys(obj).forEach((key) => {  
  2.  console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo  
  3. })  

 

方式 基本属性 原型链 不可枚举 Symbol
for in
Object.keys()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()

 

顺便加一点遍历Map对象

JavaScript Code复制内容到剪贴板
  1. var m = new Map();  
  2. m.set(1, "black");  
  3. m.set(2, "red");  
  4. m.set("colors", 2);  
  5. //方法一:  
  6. m.forEach(function (item) {  
  7.      console.log(item.toString());  
  8. });  
  9.    
  10. //方法二:  
  11. m.forEach(function (value, key, map) {  
  12.     console.log(value)  
  13.  })  
  14. // 输出:  
  15. // black  
  16. // red  
  17. // 2  
  18. //方法三:  
  19. for (var [key, value] of m) {  
  20.   console.log(key + ' = ' + value);  
  21. }  
  22. // 输出:  
  23. // 1 = black  
  24. // 2 = red  
  25. // colors  = 2  

 

 

 

本文来自于:http://www.yoyo88.cn/study/vue/210.html

上一篇 vue router-link
Powered by yoyo苏ICP备15045725号