オブジェクト配列のプロパティの値の重複を削除する

ある要素(以降キー値)が重複している場合は、はじめに出てきたもののみを残してそれ以降のものを削除したリストにしたい

重複を削除する

dupList =[
  { key: 'a', data: 'Satou'},
  { key: 'a', data: 'Suzuki'},
  { key: 'b', data: 'Takahashi'},
  { key: 'a', data: 'Tanaka'},
  { key: 'c', data: 'Watanabe'},
  { key: 'c', data: 'Itou'},
];

var cleanList = dupList.filter(function (x, i, self) { 
  return (self.findIndex(function (y) {
    return (x.key === y.key)
  }) === i);
});

console.log(cleanList);
// [ 
//   { key: 'a', data: 'Satou'},
//   { key: 'b', data: 'Takahashi'},
//   { key: 'c', data: 'Watanabe'}
// ]

findIndex()で引き当てたキーのインデックスとフィルタ中のインデックスが一致した場合のみ残し、それ以外は削除する

上記コードは前方が優先。後方を優先したい場合はfindIndex()の代わりにArray.prototype.lastIndexOf()を使えばおk。

削除されたものも取り出す

同時に削除されたオブジェクトも取り出したい時用。

dupList =[
  { key: 'a', data: 'Satou'},
  { key: 'a', data: 'Suzuki'},
  { key: 'b', data: 'Takahashi'},
  { key: 'a', data: 'Tanaka'},
  { key: 'c', data: 'Watanabe'},
  { key: 'c', data: 'Itou'}
];

var delList = [];
var cleanList = dupList.filter(function (x, i, self) { 
  var res = (self.findIndex(function (y) {
    return (x.key === y.key)
  }) === i);
  if (!res) delList.push(x);
  return res
});

console.log(cleanList);
// [ 
//   { key: 'a', data: 'Satou'},
//   { key: 'b', data: 'Takahashi'},
//   { key: 'c', data: 'Watanabe'}
// ]

console.log(delList);
// [
//   { key: 'a', data: 'Suzuki'},
//   { key: 'a', data: 'Tanaka'},
//   { key: 'c', data: 'Itou'}
// ]
タイトルとURLをコピーしました