从时刻js中从数组中删除重复项

时间:2018-12-06 07:02:13

标签: javascript momentjs

我有

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)))

在index.html中运行实时plunker代码

2 个答案:

答案 0 :(得分:2)

您在正确的轨道上,但是细节有些偏离。请尝试以下方法:

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)是用于在数组中查找唯一值的有用模式
  • 模式背后的直觉是“仅选择数组中值的 first 个实例”
  • 它仅适用于可以直接比较的值-indexOf在内部使用严格的相等性检查(===
  • momentValue.valueOf()将为该比较返回一个有用的值,即自Unix纪元以来的毫秒数。
  • 我们的解决方案使用一个辅助数组,该数组由valueOffilter中的毫秒值组成,并在迭代中使用当前值的valueOf()进行比较

如果要使用isSame,另一种方法可能是这样的:

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

答案 1 :(得分:1)

只需一个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>