JavaScript: 用日期过滤数组中的重复元素

3
我正在使用Angular2,我有一个包含日期对象的数组(约1000个)。 大多数日期对象具有完全相同的日期(例如2016_11_02; 日期没有小时和分钟)。 通常在数组中应该有约10-20个不同的日期。
现在我想过滤这个数组并删除重复的日期。 最终数组中应该有约10-20个日期对象。
以下是我尝试的代码:
let uniqueArray = duplicatesArray.filter(function(elem, pos) {
            return channelEPGDates.indexOf(elem) == pos;
        });
        console.log('unique: ' + uniqueArray.length);

我知道这不正确,因为unique-Array与旧数组具有相同的长度。但是我如何在过滤函数中比较日期本身呢?
非常感谢!

如果你想要高效处理,而且你只在较新的浏览器上运行,那么Array.reduce是一个不错的选择。 - Emil S. Jørgensen
4个回答

13

我会使用getTime方法将日期映射到时期时间,然后将它们映射回Date对象。

let uniqueArray = duplicatesArray
.map(function (date) { return date.getTime() })
.filter(function (date, i, array) {
    return array.indexOf(date) === i;
 })
.map(function (time) { return new Date(time); });

这是一个好的、简短的解决方案! 你能否更新你的答案为“.filter(function (date, i, array) {”?那我就可以标记它了 ;) - Junias
糟糕,发现了一个问题。已经修复 :) - Gregor Menih

3
您可以使用 Set展开语法 ... 来实现。
unique = src => [...new Set(src)];

var unique = src => [...new Set(src)];
    array = ["Mike", "Matt", "Nancy", "Adam", "Jenny", "Nancy", "Carl"];

console.log(unique(array));

要获取带有唯一日期的对象,可以使用闭包、Set和回调函数来过滤数据并获取需要唯一的部分。

var unique = (src, fn) => src.filter((s => o => !s.has(fn(o)) && s.add(fn(o)))(new Set));
    array = [{ date: new Date('2019-11-01')}, { date: new Date('2019-11-01')}, { date: new Date('2019-11-01')}, { date: new Date('2019-11-02')}, { date: new Date('2019-11-01')}, { date: new Date('2019-11-05')}, { date: new Date('2019-11-05')}, { date: new Date('2019-11-04')}, { date: new Date('2019-11-07')}];

console.log(unique(array, ({ date }) => date.toISOString().slice(0, 10)));
.as-console-wrapper { max-height: 100% !important; top: 0; }


@SergeyReutskiy,当然也可以使用对象,但是只能使用相同的对象引用。由于我看到的数据是字符串而不是对象,所以在使用map时效果很好。如果有对象,则需要一个字符串化的项。 - Nina Scholz
1
你提供的答案是用于去重的,而且这确实是一种非常好的方法,但它并没有回答OP的问题,因为他要求特别移除 Date 对象。当然,除非如你所述它们具有相同的引用。如果它们没有呢?如何移除具有相同值但不同引用的重复 Date 对象。 - qasimalbaqali

0

你可以这样使用jQuery:

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

-1
这是一种使用数组内置方法的方法。

var arr = ["John", "Jimmy", "John"];
var dArr = []; //Date array
while (dArr.length < 10000) { //Load a lot of pseudo dates
  dArr.push(
    new Date().getTime() + Math.round(Math.random() * 10)
  );
}

function arrayUnique(arr) {
  return arr.reduce(function(previousValue, currentValue) {
    if (previousValue.some(function(value, index) {
      return value === currentValue;
    }) === false) {
      previousValue.push(currentValue);
    }
    return previousValue;
  }, []);
}

console.log(arrayUnique(arr));
console.log(arrayUnique(dArr).sort());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接