前言:2018/1/18 12:24 第一次在掘金髮表文章,收穫這麼多贊挺意外的,感謝大家賞臉[拜謝]。因工作繁忙,本週有空會繼續補充更新該文章的,喜歡的可以通過點贊或收藏跟進動態啦。再次感謝[鞠躬]~!
1/19 18:35 更新:
- 1.評論區老鐵們說的陣列去重的set的實現模式,字串去重;
- 2.增加filter + map搭配使用的場景引入(其實我想說的重點是這個[捂臉]);
- 3.滋潤下文字表達,增加一些必要的註釋說明;
- 4.排版重構
filter
1.定義
filter 為陣列中的每個元素呼叫一次 callback 函式,並利用所有使得" callback 返回 true 或 等價於 true 的值 的元素"建立一個新陣列。
var new_array = arr.filter(callback[, thisArg])
複製程式碼
2.基礎用法
var spread = [12, 5, 8, 130, 44]
// 篩選條件符合大於10的新陣列
var filtered = spread.filter(n => n >= 10)
console.log('filtered', filtered) // => [12, 130, 44]
複製程式碼
3.進階用法
陣列物件的鍵名/鍵值的搜尋
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'ared', 'age': 24, 'active': false },
{ 'user': 'ered', 'age': 80, 'active': false },
{ 'abc': 'ered', 'age': 80, 'active': false }
]
// 篩選 age等於40或者age等於24的 陣列物件
var filtered = users.filter(n => n.age===40 || n.age===24)
console.log('filter後的鍵名', filtered) // => [{user: "fred", age: 40, active: false},{user: "ared", age: 24, active: false}]
複製程式碼
4.高階用法
4.1 陣列去重
var spread = [12, 5, 8, 8, 130, 44,130]
var filtered = spread.filter((item, idx, arr) => {
return arr.indexOf(item) === idx;
})
// 篩選符合條件找到的第一個索引值等於當前索引值的陣列
console.log('陣列去重結果', filtered)
複製程式碼
感謝評論區@緣童鞋等老鐵分享想法,陣列去重用ES6的set方法的實現模式
var spread = [12, 5, 8, 8, 130, 44,130]
var setFun = [...new Set(spread)]
console.log('陣列去重結果', setFun)
複製程式碼
感謝評論區@菜鳥_it_老鐵分享的字串去重,大家可以參考一下
var arr=[12, 5, 8, 8, 130, 44,130,'a','b','a']
var obj={};
arr.forEach(function(item){
obj[item]=item;
})
Object.keys(obj)
console.log(Object.keys(obj))
複製程式碼
大家討論對於陣列去重討論還是蠻激烈的。因此,18歲的我,建了一個供大家交流的群,對於程式碼的實現邏輯的優化,大家可以加文章底部下面的微信群,以後可能會組織線下活動以及程式設計師的單身趴吧,哈哈~~程式碼的世界很精彩,一起成長.
4.2 陣列中的空字串刪掉
var spread = ['A', '', 'B', null, undefined, 'C', ' ']
var filtered = spread.filter((item, idx, arr) => {
return item && item.trim()
})
console.log('陣列中的空字串刪掉', filtered) // => ["A", "B", "C"]
複製程式碼
5.一句話總結
充分利用callback返回true的特點當作"過濾條件"函式,生產新的陣列
6.專案實踐
filter的常用搭配
filter與map配合:用filter符合一定條件過濾後再進行map生成新的陣列
在專案中,有時候我們需要在將原陣列根據一定條件過濾後再進行map生成新的資料
for + continue 寫法
var arr = [{
gender: 'man',
name: 'john'
}, {
gender: 'woman',
name: 'mark'
}, {
gender: 'man',
name: 'jerry'
}]
var forArr = []
for (var i = 0; i < arr.length; i++) {
// 遇到性別為女的陣列物件, 跳出本次迴圈
if (arr[i].gender === 'woman') continue
var temp = {
name: arr[i].name
}
forArr.push(temp)
}
// 過濾掉性別為女的陣列物件
console.log('男性名字集合', forArr) // => [{name: 'john'}, {name: 'jerry'}]
複製程式碼
用for + continue方法後,我們成功將遇到性別為女的陣列物件剔除掉了,最終篩選出男性名字的陣列集合。for迴圈如果遇到多層巢狀是比較冗雜且不易維護的。我們能不能用map代替呢?但是map不支援continue跳出迴圈。
問題: 那又想用map減少程式碼量,又想用continue跳出迴圈,怎麼辦?
解決:或許用filter與map的搭配使用可以解決我們遇到的問題(可代替for + continue 的使用)
程式碼演示: filter +map 寫法
var arr = [{
gender: 'man',
name: 'john'
}, {
gender: 'woman',
name: 'mark'
}, {
gender: 'man',
name: 'jerry'
}]
// filter : 有條件的篩選,返回條件為true的陣列
// 篩選出性別為男性的名字集合
var newArr = arr.filter(n => n.gender === 'man').map(item => {
return {
name: item.name
}
})
console.log('男性名字集合', newArr) // => [{name: 'john'}, {name: 'jerry'}]
複製程式碼
用filter +map 寫法方法後,我們簡簡單單用兩三行程式碼就實現出了用for + continue寫法的功能。既優雅又易讀易維護,何樂而不為呢?
that's all, 以上就是我的個人的經驗總結,如果對你的開發有幫助,歡迎點贊,如果覺得哪裡出錯了,歡迎指出,大家一起進步,共同成長~。~
一起交流?
你有好的想法可以一起交流,訂閱微信公眾號yhzg_gz(點選複製,在微信中新增公眾號貼上即可),追求程式碼質量,高效率程式設計是我們共同的目標。
寫文章可以得非同步社群的書!愛讀書的技術人都在非同步社群。我想要讀編寫可維護的JavaScript,希望你也能夠喜歡。