57483


JavaScriptの配列で重複削除をしたいのです。

例えばarray = [item0, item1, item2, item3
...]として、itemはそれぞれに主キーとUserIDと値を持ちます。主キーはもちろんユニークですが、UserIDは重複する場合があり、UserIDが重複するitemは配列から削除したいのです。
現時点では同じユーザーが複数の値を配列に入れており、値の数が配列のサイズになっていますが、これをユーザーの数にしたいのです。

mapを使い、UserIDをキーにして、同じUserIDが来た際には値を上書きして（値自体はなんでも良いのでいくら上書きしても構わない）、そのmapを配列に直すという方法を試したいのですが、コードがうまく書けません。ちなみに処理を軽くしたいのでループは可能な限り使いたくはありません。

どなたか教えてくれませんか？

[code]

    const array = [item0, item1, item2, item3, item4 ...];
    
    if (array !== undefined && array.length != 0){
        const map = new Map();
        array.forEach((element) => {
            map.set(element.get('userID'), element)
        })
    
    };
    
[/code]

こう書けば、mapの中にUserIDが重複しないitemを入れることはできます。  
今度はmapの値だけを、元のarrayに更新せなばなりませんが、そのやり方がちょっと分からないです。


CC BY-SA 4.0
2019-08-20T02:45:09.760
57470
2019-08-20T23:54:30.133
2019-08-20T04:15:57.997
35503
35503
question
javascript
mapを使った配列の重複削除の実装


`Map` オブジェクトの各要素の値は、 `Map.prototype.values` メソッドを用いて取得出来ます。また、スプレッド構文を使うことで
iterable オブジェクトを展開出来ます。

[code]

    {
      const map1 = new Map();
    
      map1.set('0', 'foo');
      map1.set(1, 'bar');
    
      const iterator1 = map1.values();
    
      console.log(...iterator1); //=> foo bar
    }
    
[/code]

ここから、 `Map.prototype.values` メソッドの返り値を配列内に展開し、それを変数 array に代入することで、 `Map`
オブジェクトの各要素の値のみを元の配列へ代入出来るとわかります。

[code]

    {
      let array = [{pk: 1, userid: 1}, {pk: 2, userid: 2}, {pk:3, userid: 2}, {pk: 4, userid: 3}, {pk: 5, userid:1}];
      if (array !== undefined && array.length != 0) {
        const map = new Map();
        array.forEach(element => map.set(element["userid"], element));
    
        console.log(...map.values()); //=> Object { pk: 5, userid: 1 } Object { pk: 3, userid: 2 } Object { pk: 4, userid: 3 }
        console.log([...map.values()]); //=> Array(3) [ {…}, {…}, {…} ]
    
        array = [...map.values()];
    
        console.log(array); //=> Array(3) [ {…}, {…}, {…} ]
      }
    }
    
[/code]

* * *

今回の場合、ユーザー ID のみがわかっていれば良いので、 `Set` オブジェクトを使用することも出来ます。

[code]

    {
      const array = [{pk: 1, userid: 1}, {pk: 2, userid: 2}, {pk:3, userid: 2}, {pk: 4, userid: 3}, {pk: 5, userid:1}];
      const set = new Set();
      const filteredArray = [...array].reverse().filter(e => !set.has(e.userid) && set.add(e.userid));
      console.log(filteredArray); //=> Array(3) [ {…}, {…}, {…} ]
    }
    
[/code]


CC BY-SA 4.0
2019-08-20T07:37:11.057
57483
2019-08-20T23:54:30.133
2019-08-20T23:54:30.133
32986
32986
57470
answer