假設現在有一個物件數組
arr=[
{
id:1,
content:'a'
},{
id:2,
content:'b'
},{
id:2,
content:'c'
},{
id:3,
content:'d'
},{
id:3,
content:'e'
},{
id:3,
content:'f'
},{
id:3,
content:'g'
},{
id:4,
content:'h'
},
]
我想去掉相同的id 然後保留各個id的最後一項
arr=[
{
id:1,
content:'a'
},{
id:2,
content:'c'
},{
id:3,
content:'g'
},{
id:4,
content:'h'
},
]
有什麼好一點的方法嘛。 。
依慣例,ES6 代碼
這裡有一個問題,
findIndex
至少有兩個瀏覽器不支持,所以,如果不支持的話,只好自己寫一個其它解法
經典解決,用 Map
因為 id 不是字串,所以使用 ES6 的
Map
類別。當資料量大的時候,使用查找表,比在列表中線性查找,效率會有顯著的提升。其實也可以用物件來取代 map,至少在這個用例中不會有問題。因為沒用 es6 特性,所以索性完全使用 es5 語法。程式碼結構和邏輯跟上面那段一樣
怪異解法,利用整數 id
因為是整數 id,所以可以直接按這個 id 放在陣列中。如果遇到相同 id,直接就替換了。如果 id 不連續,最後需要把空元素過濾掉
這種解法還有個問題,不能保持原數組的元素順序。然後一定會有人想到,用 Map 的那個解法也可以把程式碼精減成類似的程式碼,而不需要搞那麼複雜,當然它也同樣可能失去原有順序
使用箭頭函數簡單如下:
這裡面已經有很多答案了,不過沒有提到Array的內建函數reduceRight,實際上題主的需求,要求保留相同id的最後一位,用reduceRight實現起來很方便。
reduceRight從你原數組尾端開始循環的,我這裡的初始值是個數組,r[0]用來存放id的Set,r[1]存放結果數組,如果Set裡沒有id,那就加這個id到Set,並且把這一項放在結果陣列的頭部。
最終很容易的實現了題主的需求,而且順序也能保證。
親測有效
雷雷
讓 newArr = [],
雷雷雷雷
參考一下
你可以參考我部落格寫的,我部落格寫了8中方法。 http://alfierichou.top/2017/0...