🔍

JS_オブジェクト配列の重複削除(ユニーク)に条件指定して制御できる関数を作ってみた

2024/01/03に公開

こちらの記事を読み、

[TypeScript]オブジェクトの配列をオブジェクト内の特定のプロパティに着目して重複排除する
https://zenn.dev/purratto/articles/5433b814dadfb4

ユニーク化するときに、条件判定を入れるのは面白いなと思ったので、汎用関数にしてみました。

コードと動作結果は次の通りです。

const postData = [
  {
    id: '001',
    version: '1',
    content: '001-1',
  },
  {
    id: '002',
    version: '1',
    content: '002-1',
  },
  {
    id: '001',
    version: '3',
    content: '001-3',
  },
  {
    id: '001',
    version: '2',
    content: '001-2',
  },
];

const _unique = (
  array,
  uniqValueFunc = (v => v),
  overwriteFunc = (a, b) => false,
  detail = false,
) => {
  const index = [];
  const result = [];
  const count = [];
  array.forEach(v => {
    const uniqValue = uniqValueFunc(v);
    const indexResult = index.indexOf(uniqValue);
    if (indexResult === -1) {
      index.push(uniqValue);
      result.push(v);
      count.push(1);
    } else {
      if (overwriteFunc(result[indexResult], v)) {
        result[indexResult] = v;
      }
      count[indexResult] += 1;
    }
  });
  if (detail) {
    return { index, result, count };
  }
  return result;
};

// 常に元の値を優先
console.log(_unique(postData, v => v.id));
// [
//   { id: '001', version: '1', content: '001-1' },
//   { id: '002', version: '1', content: '002-1' }
// ]

// 常に上書き
console.log(_unique(postData, v => v.id, () => true));
// [
//   { id: '001', version: '2', content: '001-2' },
//   { id: '002', version: '1', content: '002-1' }
// ]

// バージョンが上なら上書き
console.log(_unique(postData, v => v.id, (a,b) => a.version < b.version));
// [
//   { id: '001', version: '3', content: '001-3' },
//   { id: '002', version: '1', content: '002-1' }
// ]

ライブラリはここで公開しているのを元にしました。
partsjs/source/array/_unique.js at master · standard-software/partsjs
https://github.com/standard-software/partsjs/blob/master/source/array/_unique.js#L2

Discussion