オブジェクトの配列を含むオブジェクトがあります。
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
))
)
より一般的な解決策は次のようになります。
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']);
説明