Удалить дубликаты из массива с объектами - PullRequest
0 голосов
/ 17 января 2020

У меня есть что-то вроде этого:

  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}`;
    });
  }

Я пытаюсь удалить любые дубликаты из массива 'items' с помощью метода _uniqBy, но он не работает. Я думаю, это потому, что для этих items._id всегда разные, но items.place мог бы быть равным, и если бы я хотел избавиться от этого.

Может быть, лучший способ проверить, является ли тот же item.place уже в этом массиве, но не знаю, как это сделать.

РЕДАКТИРОВАТЬ: Чтобы быть более точным, элементы выглядят следующим образом:

0: place: {name, street, city, etc...}
   _id: 0

Таким образом, возможно иметь очень похожий объект whitch отличается rnet только одним свойством на месте {}

Ответы [ 3 ]

0 голосов
/ 17 января 2020

Вы можете использовать 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 свойством

0 голосов
/ 17 января 2020
  • объявление массива простых объектов со свойствами 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);
0 голосов
/ 17 января 2020

Я бы предложил использовать _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);
...