[英]Remove duplicates from Array with Objects
我有这样的事情:
items: { _id: number; place: SomeAddressClassDto }[] = [];
sessionItem: { _id: number; place: SomeAddressClassDto };
createAddressList() {
this.service.getWorkingPlaces().subscribe((items) => {
this.items = items;
this.sessionItem = {
place: JSON.parse(sessionStorage.getItem('currentPlace')),
_id: this.items.length,
};
this.items.push(this.sessionItem);
// _.uniqBy(this.items, 'place')
const idx = items.findIndex((item) => this.service.comparePlaces(item.place,
this.service.getCurrentWorkingPlace()));
if (idx !== -1) this.radiobox.option = `${idx}`;
});
}
我正在尝试使用 _uniqBy 方法从“items”数组中删除任何重复项,但它不起作用。 我认为这是因为对于这个 items._id 总是不同的但 items.place 可以是平等的,如果是我想摆脱这个。
也许更好的方法是检查相同的 items.place 是否已经在该数组中,但不知道如何执行此操作。
编辑:更详细地说,项目如下所示:
0: place: {name, street, city, etc...}
_id: 0
因此,可能有非常相似的对象,而它们的不同之处仅在于一个属性的位置{}
我建议使用_id
来确定该值是否唯一。 如果您使用place
值可能始终是唯一的,因为它们可能是同一类的不同实例。(如果是这种情况,我无法从您的代码中看出)
createAddressList() {
this.service.getWorkingPlaces().subscribe((items) => {
this.items = items;
this.sessionItem = {
place: JSON.parse(sessionStorage.getItem('currentPlace')),
_id: this.items.length,
};
this.items.push(this.sessionItem);
_.uniqBy(this.items, '_id');
const idx = items.findIndex((item) => this.service.comparePlaces(item.place, this.service.getCurrentWorkingPlace()));
if (idx !== -1) {
this.radiobox.option = `${idx}`;
}
});
}
或者,你可以使用属性从内place
,以确定它们是否喜欢这个独特的:
_.uniqBy(this.items, (x) => x.place && x.place.someOtherPropertyInsideOfPlace);
您可以使用Array.Prototype.reduce()
和Array.prototype.find()
根据place
属性创建一个没有重复项的数组。
举个例子:
const test = [
{ _id: 1, place: 'a' },
{ _id: 2, place: 'a' },
{ _id: 3, place: 'a' },
{ _id: 4, place: 'b' },
{ _id: 5, place: 'c' },
]
const noDups = test.reduce((accum, current)=> {
if(!accum.find(item => item.place === current.place))
accum.push(current)
return accum
}, [])
console.log(noDups)
reduce()
将创建一个新数组(在这种情况下, accum
变量被初始化为一个空数组),但如果.place
属性是唯一的,如果它尚未找到一个新数组,则仅在新数组中添加新项目具有相同.place
属性的项目
声明一个带有 id 和 place 属性的简单对象数组。
通过 javascript 过滤功能删除重复项。
filter 函数将从数组中删除位置为 paris 的对象。
var arr = [{ _id: 1, place: 'paris' }, { _id: 2, place: 'tokyo' }, { _id: 3, place: 'ontario' }, { _id: 4, place: 'paris' }, { _id: 5, place: 'karachi' }, { _id: 6, place: 'paris' }, { _id: 7, place: 'new york' } ]; var newArray = arr.filter((self, item, index) => index.findIndex(t => (t.place === self.place)) === item); console.log(newArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.