удалить дубликаты из массива в момент JS - PullRequest
0 голосов
/ 06 декабря 2018

у меня есть

let  array = [moment('2019-01-17'),moment('2019-01-19'),moment('2019-01-19'),moment('2019-01-21')];

мне нужно удалить дубликаты

, поэтому я написал фильтр, но он работает неправильно

array= array.filter((v,i) => !moment(array.indexOf(v)).isSame(moment(i)))

работает в реальном времени plunker код внутри index.html

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вы можете достичь того же результата и быстрее с помощью всего одного Array.reduce, и как только вы соберете элементы, сгруппированные, просто получите их через Object.values,Это будет быстрее, чем для каждого элемента, ищущего весь массив каждый раз.Для небольших массивов это не имеет значения, но для больших это будет весьма заметно.

Вот краткая версия:

let data = [moment('2019-01-17'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-21')];

const result = data.reduce((a, c) => (a[c.format()] = c, a), {})

console.log(Object.values(result))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

А вот подробный:

let data = [moment('2019-01-17'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-19'), moment('2019-01-21')];

const result = data.reduce((accumulator, current) => {
   accumulator[current.format()] = current
   return accumulator
}, {})

console.log(Object.values(result))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 06 декабря 2018

Вы были на правильном пути, но детали были немного не в порядке.Пожалуйста, попробуйте это:

const comparisonValues = array.map(v => v.valueOf());
array = array.filter((v,i) => comparisonValues.indexOf(v.valueOf()) == i);

Объяснение:

  • array.filter((value, index, self) => self.indexOf(value) == index) - это полезный шаблон для поиска уникальных значений в массиве
  • Интуиция позади шаблона«выбрать только первые экземпляры значения в массиве»
  • Работает только для значений, которые можно сравнивать напрямую - indexOf внутренне использует строгую проверку на равенство (===)
  • momentValue.valueOf() вернет полезное значение для этого сравнения, а именно количество миллисекунд с начала эпохи Unix
  • Наше решение использует вспомогательный массив, который состоит из значений миллисекунд от valueOf и filter, сравнивает, используя valueOf() текущего значения в итерации

Другой способ, если вы хотите использовать isSame, может быть таким:

array = array.filter((v, i) => {
  return array.findIndex(candidate => v.isSame(candidate)) == i
});
...