2017-05-17 27 views
1

In unserer angularjs App erhalten wir eine Reihe von Daten, die dann herausgefiltert werden müssen, um nur ein Array voller eindeutiger Daten (keine Zeichenketten) zurückzugeben. Ich habe einige der Antworten auf SO ausprobiert, aber ich denke, weil ich Daten und nicht Strings vergleiche - ich gebe andere Ergebnisse. Jede Hilfe bei der besten Vorgehensweise wäre sehr hilfreich. enter image description hereRückgabe Array eindeutiger Daten von Datum Array

Antwort

1

Sie haben Recht, Datumsgleichheit unterscheidet sich von Stringgleichheit. Zwei Daten werden niemals gleich sein. Also, lassen Sie sich einfach die Daten in Strings drehen:

let dates = [new Date(), new Date('1/1/11'), new Date('1/1/11'), new Date('1/4/66')] 
 

 

 
let uniqueDates = dates 
 
        .map(s => s.toString()) 
 
        .filter((s, i, a) => a.indexOf(s) == i) 
 
        .map(s => new Date(s)); 
 
        
 
console.log(uniqueDates);

Die Logik mit indexOf ist, dass jeder eindeutiger Wert auf seiner eigenen Position nur vorhanden sein sollte; Alle anderen sind Duplikate (s ist das aktuelle Element, i ist der aktuelle Index und a ist das Array selbst). Dann ordnen wir das Array wieder in Dates an und geben es zurück.

+1

danke - der Refactor Ihres Codes war das Sahnehäubchen. Ich denke, ich war zuvor zu kompliziert, indem ich die Idee, zu einer Zeichenkette zu konvertieren, zurückwarf, und dann wieder zurück – chris

+1

Kein Problem! Wenn man darüber nachdenkt, ist es einfacher, '.toString()' durch '.getTime()' zu ersetzen. Das gibt das Datum als einfache Zahl, Epoche zurück. Cleaner und ein wenig effizienter als Strings zu vergleichen. – joh04667

1

Wenn Sie lodash verwenden:

const date1 = new Date(); 
const date2 = new Date(); 
const arr = [date1, date1, date2, date2]; 
const uniqueDates = _.uniqBy(arr, date => date.getTime()); 

Verwendet uniqBy um sicherzustellen, dass wir Daten nach ihrem Wert zu vergleichen, und zwar nicht nur durch Objektidentität. Siehe hier: Compare two dates with JavaScript

Verwandte Themen