用一些魔法怎么样?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']);
Stackblitz 示例
解释
- 首先了解使用的两种方法:
- 接下来,你的想法是什么使你的两个对象相等,并牢记这一点。
- 我们可以将某些东西检测为重复项,如果它满足我们刚刚想到的标准,但它的位置不是在具有该标准的对象的第一个实例处。
- 因此,我们可以使用上述标准来确定某些内容是否重复。