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

У меня проблема с построением канала передачи данных фильтра. Я хотел бы передать данные с удаленными дубликатами из моего объекта.

Это мой ngFor:

<ng-container *ngFor="let message of messages | filterDates">

Я хотел бы передать свой массив сообщений через этот канал, чтобы удалить повторяющиеся даты из каждый объект. Каждый объект в моем массиве имеет

'timestamp': 1590064423327

некоторые объекты имеют одинаковую метку времени, а некоторые нет. Я хотел бы установить метку времени равной нулю в этих объектах, если предыдущий объект из массива имеет такое же значение метки времени. Если предыдущий имеет другое значение временной метки, я хотел бы передать временную метку, как в текущем объекте.

Чтобы лучше понять, пример: я получаю сообщения от моего API с временными метками. Я хотел бы показать дату только для первого сообщения, потому что следующие сообщения относятся к тому же дню, поэтому нет необходимости показывать дату для этих сообщений. Если следующие сообщения поступают не в тот же день, я хотел бы отображать только значение даты первого сообщения со следующей отметки времени. Он предназначен для группировки сообщений по дате.

Я подготовил канал для этого, но, к сожалению, я не уверен, что делать в этом канале для достижения этой конкретной цели c. Я почти уверен, что мне следует использовать Loda sh, но я точно не знаю, какой оператор мне использовать. Заранее благодарим вас за любую помощь.

Это проблема, которая у меня возникла от @ Yoge sh Ответ разработчика:

enter image description here

Я думаю, что проблема здесь в том, что он нажимает на элемент массива с нулевым значением, а затем сравнивает следующий элемент с нулевой меткой времени. Я забыл упомянуть, что мне нужно сравнивать метки времени в формате даты, потому что метки времени указаны с секундами, поэтому они всегда будут разными. Вот как я сравниваю отформатированные даты с моментом js:

if (index > 0 && (moment(message.timestamp).format('DD/MM/YYYY') == moment(messages[index - 1].timestamp).format('DD/MM/YYYY'))) {
        message.timestamp = null
      }
      finalMessages.push(message)

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Должно работать нормально

let finalMessages = [];
let prevTimestamp = null;
messages.forEach((message, index) => {
  if (moment(message.timestamp).isSame(moment(prevTimestamp), 'days')) {
    message.timestamp = null
  } else {
    prevTimestamp = message.timestamp
  }
  finalMessages.push(message)
})
0 голосов
/ 25 мая 2020

простое решение - создать массив displayMessages в вашем javascript, а затем использовать displayMessages в вашем NgFor l oop.

let displayMessages = [];
let timeStampHash = {};
messages.forEach(message) => {
  if (!timeStampHash[message.timestamp]) {
    timeStampHash[message.timestamp] = true;
    displayMessages.push(message);
  }
})
this.displayMessages = displayMessages;
0 голосов
/ 25 мая 2020

Вы можете сделать что-то вроде этого в своем filterDate pipe:

let finalMessages = []
messages.forEach((message, index) => {
  if (index > 0 && (message.timestamp == messages[index - 1])) {
    message.timestamp = null
  }
  finalMessages.push(message)
})
...