オブジェクトの配列から重複をすべて削除するにはどうすればいいですか? 質問する

オブジェクトの配列から重複をすべて削除するにはどうすればいいですか? 質問する

オブジェクトの配列を含むオブジェクトがあります。

obj = {};

obj.arr = new Array();

obj.arr.push({place:"here",name:"stuff"});
obj.arr.push({place:"there",name:"morestuff"});
obj.arr.push({place:"there",name:"morestuff"});

配列から重複したオブジェクトを削除する最適な方法は何かと思っています。たとえば、次のようobj.arrになります...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

ベストアンサー1

ES6 マジックはいかがでしょうか?

obj.arr = obj.arr.filter((value, index, self) =>
  index === self.findIndex((t) => (
    t.place === value.place && t.name === value.name
  ))
)

参考URL

より一般的な解決策は次のようになります。

const uniqueArray = obj.arr.filter((value, index) => {
  const _value = JSON.stringify(value);
  return index === obj.arr.findIndex(obj => {
    return JSON.stringify(obj) === _value;
  });
});

代わりに上記のプロパティ戦略を使用しますJSON.stringify:

const isPropValuesEqual = (subject, target, propNames) =>
  propNames.every(propName => subject[propName] === target[propName]);

const getUniqueItemsByProperties = (items, propNames) => 
  items.filter((item, index, array) =>
    index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNames))
  );

propNamesプロパティを配列または値のいずれかにしたい場合は、ラッパーを追加できます。

const getUniqueItemsByProperties = (items, propNames) => {
  const propNamesArray = Array.from(propNames);

  return items.filter((item, index, array) =>
    index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNamesArray))
  );
};

両方を許可しgetUniqueItemsByProperties('a')getUniqueItemsByProperties(['a']);

Stackblitzの例

説明

  • まず、使用される 2 つの方法を理解することから始めます。
  • 次に、2 つのオブジェクトが等しい理由について考え、それを念頭に置いてください。
  • 先ほど考えた基準を満たしているが、その位置が基準を満たすオブジェクトの最初のインスタンスではない場合は、それを重複として検出できます。
  • したがって、上記の基準を使用して、何かが重複しているかどうかを判断できます。

おすすめ記事