文章目錄
JavaScript 依屬性值過濾陣列取得完整物件
之前筆記 JavaScript 在遞迴陣列中取得特定屬性值 紀錄到如何將依屬性名稱取出陣列物件屬性值,當時需求是為了取得物件內包含的所有 id 值用來比較是否全選下層的依據,在文章內也提到只取出特定屬性值容易造成後續維護困難(當時是為了 treeview 畫面顯示,盡量節省資料量及物件複雜度),而為了完整操作物件就是今天的 依屬性值取得完整物件
找出所有符合條件的物件
陣列範例
var dataobj=[ { name:'ASP.NET MVC', type:3, salary:15000, headcount:25 },{ name:'Java', type:3, salary:25000, headcount:75 },{ name:'Python', type:3, salary:22000, headcount:50 },{ name:'React', type:1, salary:22000, headcount:30 },{ name:'Angular', type:1, salary:20000, headcount:15 },{ name:'Oracle', type:2, salary:28000, headcount:10 },{ name:'Sql Server', type:2, salary:18000, headcount:8 } ];
使用自定 function
anonymous function
function findObjectByProporigin(arr, prop, val) { let result=[]; arr.map(function(el){ if(el[prop]===val){ result.push(el); } }); return result; } findObjectByProporigin(dataobj,"type",3)
arrow function
function findObjectByProp(arr, prop, val) { let result=[]; arr.map(el=>{ if(el[prop]===val){ result.push(el); } }); return result; } findObjectByProp(dataobj,"type",2)
使用 ES6 -
filter
dataobj.filter(obj =>obj.type === 3)
使用 lodash -
filter
_.filter(dataobj, (obj)=>obj.type === 2)
使用 Ramda -
filter
R.filter(obj=>obj.type===1, dataobj)
心得
一口氣紀錄了好幾種寫法,包括自己刻 function、透過 ES6 特性與使用套件,大家喜歡哪個寫法勒?以前 ES6 語法尚未普及的年代(哈哈 講得好像好幾十年前,事實上也不過 3-5 年前而已),使用 lodash、underscore 這類擴充套件可以讓開發速度及執行速度都有倍數等級的提昇,但在 ES6 多已內建在瀏覽器的今天,部份使用上引用這類外部套件就變得不再非要不可
,當然 lodash 這類套件功能強大,絕不只今天介紹使用的 api 而已,至少相容性跟強健性都比較好,不過還是要依實際需求來衡量比較正確
參考資訊
文章作者 Yowko Tsai
上次更新 2021-11-02
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。