我有
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代码
答案 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)
是用于在数组中查找唯一值的有用模式===
)momentValue.valueOf()
将为该比较返回一个有用的值,即自Unix纪元以来的毫秒数。valueOf
和filter
中的毫秒值组成,并在迭代中使用当前值的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>