2016-11-04 5 views
1

Я использую Angular2, и у меня есть массив с объектами Date (~ 1000). Большинство объектов даты имеют точно такие же даты (например, 2016_11_02; Даты не имеют часов & минут). Обычно в массиве должно быть около ~ 10-20 различных дат.Javascript: Filter Array with duplicate Dates

Теперь я хочу отфильтровать этот массив и удалить дубликаты дат. Итак, в конце должно быть около ~ 10-20 Date-Objects в массиве.

Here's код, который я пробовал:

let uniqueArray = duplicatesArray.filter(function(elem, pos) { 
      return channelEPGDates.indexOf(elem) == pos; 
     }); 
     console.log('unique: ' + uniqueArray.length); 

Я знаю, что это не правильно, причиной уникального массива имеет ту же длину, что и старый массив. Но как я могу сравнить сам Даты в функции фильтра?

Большое спасибо!

+0

Если вы хотите быть эффективным об этом, и вы только на более поздних версиях браузеров, тогда [Array.reduce] (https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) - хорошая ставка. –

ответ

2

Я бы карту даты к эпохе времени, используя метод 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); }); 
+0

отлично, спасибо! Это хорошее, короткое решение! Не могли бы вы обновить свой ответ на '.filter (function (date, i, array) {', тогда я могу отметить его;) – Junias

+0

Упс, приятно поймать. Исправлено: – ItsGreg

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

1

Вы можете использовать Set и spread syntax... для него.

unique = src => [...new Set(src)]; 

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

 
console.log(unique(array));

+0

Не работает для Date-Objects –

+0

@SergeyReutskiy, конечно же, он работает и с объектами, но только с той же ссылкой на объект. поскольку я вижу, что данные представляют собой строку, а не объект, который хорошо работает с картой. если есть объекты, то строковый элемент поможет. –