我有这样的东西:
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方法从“项目”数组中删除所有重复项,但无法正常工作。我认为是因为这个item._id总是不同,但是items.place可以相等,如果我想摆脱这个。
也许更好的方法是检查是否有相同的项目。place已经在该数组中,但不知道如何执行。
编辑: 要更详细地说明,项目如下所示:
0: place: {name, street, city, etc...}
_id: 0
因此,仅通过一个属性就可以使非常相似的对象成为不同的对象{}
答案 0 :(得分: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);
答案 1 :(得分:0)
您可以使用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
属性的项目
答案 2 :(得分:0)
声明一个具有id和place属性的简单对象数组。
通过javascript过滤器功能删除重复项。
过滤器函数将从位置为巴黎的数组中删除对象。
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);