使用对象从数组中删除重复项

时间:2020-01-17 19:00:56

标签: javascript arrays angular typescript object

我有这样的东西:

  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

因此,仅通过一个属性就可以使非常相似的对象成为不同的对象{}

3 个答案:

答案 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);