ES6-map、filter、find、findIndex講解

map方法:能夠簡單的理解爲映射數組

1 var arr=[1,2,3,4];
2 console.log( arr.map((n)=>n*n) );//[1, 4, 9, 16]
3 console.log( arr.map((n)=>n-1) );//[0, 1, 2, 3]

從數組[1,4,-5,10]當中給我找出小於0的數字。在你看到這裏的時候相信你也是對箭頭函數了解,(n)=>n*n 就不用贅述了。函數

filter方法:學習

 1 var users = [
 2   {name: "張含韻", "email": "zhang@email.com"},
 3   {name: "江一燕",   "email": "jiang@email.com"},
 4   {name: "李小璐",  "email": "li@email.com"}
 5 ];
 6 //獲取全部人的email
 7 var emails=users.map(user=>user.email) 
 8 console.log(emails.join(',')) //"zhang@email.com", "jiang@email.com", "li@email.com"
 9 //獲取指定人的email
10 var liEmail=emails.filter(email=>/^li/.test(email))
11 console.log(liEmail.join('')) //li@email.com

獲取用戶列表裏的全部用戶的email,map幫咱們作到了,map方法經過傳一個形參,這個形參就表明users裏的每一項,map內部經過遍歷全部的用戶項,獲取到每一個用戶項的email,再push到一個數組,再做爲值給咱們返回。第二步,咱們須要獲取指定人的email,filter方法登場了,經過過濾篩選email是數組,給咱們返回結果,篩選方法得咱們定,這裏篩選方法是以正則匹配到li開頭的那一個email,而後返回。測試

find方法:this

1 [1, 4, -5, 10].find((n) => n < 0)    // -5

find方法比較好理解,這裏的參數n表明數組裏的每一項,而後find方法內部經過遍歷數組裏的每一項,找到<0的這一項( - 5 )。spa

 

findIndex方法:find方法的回調函數能夠接受三個參數,依次爲當前的值、當前的位置和原數組。看一個例子:翻譯

1 [1, 4, -5, 10].findIndex((value,index,arr) => value < 0)  // 2

在這個例子當中,value表明這個數組的每一項,1,4,-5,10。index表明每一項的索引值,arr表明這個數組[1, 4, -5, 10],而後咱們須要返回的是<0的這一項的索引值,便是2了。code

這4個方法內部機制都有一個遍歷過程,比起forEach確實簡潔多了。對象

 

 接着補充ES6-some( ) 和 every( )方法的講解: blog

 1     //every()
 2     let numbers = [2, 4, 10, 4, 8];
 3     let a = numbers.every((item,index)=>{
 4         if(item%2===0){
 5             return true;
 6         }else{
 7             return false;
 8         }
 9     });
10     console.log(a)
11 
12     //some()
13     let b=numbers.some((item,index)=>{
14          if(item%3===0){
15             return true;
16         }else{
17             return false;
18         }
19     })
20     console.log(b)

some 英語翻譯爲一些,every翻譯爲全部,每一個,因此some方法 只要其中一個爲true 就會返回true的,相反,every()方法必須全部都返回true纔會返回true,哪怕有一個false,就會返回false;every()和 some()目的:肯定數組的全部成員是否知足指定的測試。具體請參考MDNhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

總結一下:

 

後續補充:最近看不少小夥伴都在學習ES6,好比ES6中的map,在ES5中是怎麼實現的呢?

  1 /*
  2  * MAP對象,實現MAP功能
  3  *
  4  * 接口:
  5  * size()                     獲取MAP元素個數
  6  * isEmpty()                  判斷MAP是否爲空
  7  * clear()                    刪除MAP全部元素
  8  * put(key, value)            向MAP中增長元素(key, value) 
  9  * remove(key)                刪除指定KEY的元素,成功返回True,失敗返回False
 10  * get(key)                   獲取指定KEY的元素值VALUE,失敗返回NULL
 11  * element(index)             獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
 12  * containsKey(key)           判斷MAP中是否含有指定KEY的元素
 13  * containsValue(value)       判斷MAP中是否含有指定VALUE的元素
 14  * values()                   獲取MAP中全部VALUE的數組(ARRAY)
 15  * keys()                     獲取MAP中全部KEY的數組(ARRAY)
 16  *
 17  * 例子:
 18  * var map = new Map();
 19  *
 20  * map.put("key", "value");
 21  * var val = map.get("key")
 22  * ……
 23  *
 24  */
 25 function Map() {
 26     this.elements = new Array();
 27 
 28     //獲取MAP元素個數
 29     this.size = function() {
 30         return this.elements.length;
 31     };
 32 
 33     //判斷MAP是否爲空
 34     this.isEmpty = function() {
 35         return (this.elements.length < 1);
 36     };
 37 
 38     //刪除MAP全部元素
 39     this.clear = function() {
 40         this.elements = new Array();
 41     };
 42 
 43     //向MAP中增長元素(key, value) 
 44     this.put = function(_key, _value) {
 45         this.elements.push( {
 46             key : _key,
 47             value : _value
 48         });
 49     };
 50 
 51     //刪除指定KEY的元素,成功返回True,失敗返回False
 52     this.removeByKey = function(_key) {
 53         var bln = false;
 54         try {
 55             for (i = 0; i < this.elements.length; i++) {
 56                 if (this.elements[i].key == _key) {
 57                     this.elements.splice(i, 1);
 58                     return true;
 59                 }
 60             }
 61         } catch (e) {
 62             bln = false;
 63         }
 64         return bln;
 65     };
 66     //刪除指定KEY的全部元素
 67     this.removeAllByKey=function(_key){
 68         for (var i = this.elements.length - 1; i >= 0; i--) {
 69             if (this.elements[i].key == _key) {
 70                 this.elements.splice(i, 1);
 71             }
 72         }
 73     }
 74     
 75     //刪除指定VALUE的元素,成功返回True,失敗返回False
 76     this.removeByValue = function(_value) {//removeByValueAndKey
 77         var bln = false;
 78         try {
 79             for (i = 0; i < this.elements.length; i++) {
 80                 if (this.elements[i].value == _value) {
 81                     this.elements.splice(i, 1);
 82                     return true;
 83                 }
 84             }
 85         } catch (e) {
 86             bln = false;
 87         }
 88         return bln;
 89     };
 90     
 91     //刪除指定VALUE的元素,成功返回True,失敗返回False
 92     this.removeByValueAndKey = function(_key,_value) {
 93         var bln = false;
 94         try {
 95             for (i = 0; i < this.elements.length; i++) {
 96                 if (this.elements[i].value == _value && this.elements[i].key == _key) {
 97                     this.elements.splice(i, 1);
 98                     return true;
 99                 }
100             }
101         } catch (e) {
102             bln = false;
103         }
104         return bln;
105     };
106 
107     //獲取指定KEY的全部元素值VALUE,以數組形式返回,失敗返回false
108     this.get = function(_key) {
109         var arr=[];
110         try {
111             for (i = 0; i < this.elements.length; i++) {
112                 if (this.elements[i].key == _key) {
113                     arr.push(this.elements[i].value)
114                 }
115             }
116             return arr;
117         } catch (e) {
118             return false;
119         }
120         return false;
121     };
122 
123     //獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
124     this.element = function(_index) {
125         if (_index < 0 || _index >= this.elements.length) {
126             return null;
127         }
128         return this.elements[_index];
129     };
130 
131     //判斷MAP中是否含有指定KEY的元素
132     this.containsKey = function(_key) {
133         var bln = false;
134         try {
135             for (i = 0; i < this.elements.length; i++) {
136                 if (this.elements[i].key == _key) {
137                     bln = true;
138                 }
139             }
140         } catch (e) {
141             bln = false;
142         }
143         return bln;
144     };
145 
146     //判斷MAP中是否含有指定VALUE的元素
147     this.containsValue = function(_value) {
148         var bln = false;
149         try {
150             for (i = 0; i < this.elements.length; i++) {
151                 if (this.elements[i].value == _value) {
152                     bln = true;
153                 }
154             }
155         } catch (e) {
156             bln = false;
157         }
158         return bln;
159     };
160     
161     //判斷MAP中是否含有指定key,VALUE的元素
162     this.containsObj = function(_key,_value) {
163         var bln = false;
164         try {
165             for (i = 0; i < this.elements.length; i++) {
166                 if (this.elements[i].value == _value && this.elements[i].key == _key) {
167                     bln = true;
168                 }
169             }
170         } catch (e) {
171             bln = false;
172         }
173         return bln;
174     };
175 
176     //獲取MAP中全部VALUE的數組(ARRAY)
177     this.values = function() {
178         var arr = new Array();
179         for (i = 0; i < this.elements.length; i++) {
180             arr.push(this.elements[i].value);
181         }
182         return arr;
183     };
184     //獲取MAP中全部指定VALUE的元素數組(ARRAY)
185     this.getAllByValue=function(_value){
186         var arr=[];
187         for (var i = this.elements.length - 1; i >= 0; i--) {
188             if (this.elements[i].value == _value) {
189                 arr.push(this.elements[i]);
190             }
191         }
192         return arr;   
193     }
194     
195     //獲取MAP中指定key的全部VALUE的數組(ARRAY)
196     this.valuesByKey = function(_key) {
197         var arr = new Array();
198         for (i = 0; i < this.elements.length; i++) {
199             if (this.elements[i].key == _key) {
200                 arr.push(this.elements[i].value);
201             }
202         }
203         return arr;
204     };
205 
206     //獲取MAP中全部KEY的數組(ARRAY)
207     this.keys = function() {
208         var arr = new Array();
209         for (i = 0; i < this.elements.length; i++) {
210             arr.push(this.elements[i].key);
211         }
212         return arr;
213     };
214     
215     //獲取key經過value
216     this.keysByValue = function(_value) {
217         var arr = new Array();
218         for (i = 0; i < this.elements.length; i++) {
219             if(_value == this.elements[i].value){
220                 arr.push(this.elements[i].key);
221             }
222         }
223         return arr;
224     };
225     
226     //獲取MAP中全部KEY的數組(ARRAY)key有相同的 取出的key爲去重後的 數組裏去重後的key的數組
227     this.keysRemoveDuplicate = function() {
228         var arr = new Array();
229         for (i = 0; i < this.elements.length; i++) {
230             var flag = true;
231             for(var j=0;j<arr.length;j++){
232                 if(arr[j] == this.elements[i].key){
233                     flag = false;
234                     break;
235                 } 
236             }
237             if(flag){
238                 arr.push(this.elements[i].key);
239             }
240         }
241         return arr;
242     };
243 }

若是你須要兼容IE,用這個ES5寫的map應該沒有問題,明白了ES5怎麼實現ES6中的map,天然也就懂了,後續貨繼續更新ES6其餘知識點,雖然我也很菜,如發現有BUG的小夥伴,必定記得給我留言,萬分感激。

後續補充:

傳統寫法和ES6寫法對比:

 1 var users = [
 2   {name: "張含韻", "email": "zhang@email.com"},
 3   {name: "江一燕",   "email": "jiang@email.com"},
 4   {name: "李小璐",  "email": "li@email.com"}
 5 ];
 6 
 7 function valuesByKey(_key) {
 8   //定義個空數組
 9   var arr = [];
10   //循環遍歷users數組
11   for (i = 0; i < users.length; i++) {
12     //只要是key值等於_key的,對應的值都push進arr
13     arr.push(users[i][_key]);
14   }
15   //返回arr
16   return arr;
17 }
18 
19 var arr=users.map((user)=>user.name);
20 console.log(arr)//["張含韻", "江一燕", "李小璐"]
21 console.log(valuesByKey('name')) //["張含韻", "江一燕", "李小璐"]

 js數組方法能夠看我博客整理的數組相關:http://moxiaofei.com/2018/07/02/js-array/

相關文章
相關標籤/搜索