2017-05-08 4 views
0

Ich habe ein Array mit über 50 Objekt. Dieses Array ist ein Ergebnis von zwei Arrays. Elemente in diesem Array sind Objekte und jedes Objekt Schlüssel ‚date‘ mit dem Datum Zeichenfolge im Format:Javascript => Array-Elemente miteinander nach Datum übereinstimmen

`"2017-03-31T11:30:00.000Z"` 

Und Schlüssel ‚Titel‘ mit Text. So habe ich Elemente wie:

[ 
    {date: "2017-03-31T11:30:00.000Z", caption: "text_1"}, 
    {date: "2016-03-31T11:30:00.000Z", caption: "text_2"}, 
    {date: "2016-03-31T11:30:00.000Z", caption: "text_3"}, 
    {date: "2017-03-31T11:30:00.000Z", caption: "text_4"} 
] 

In Ruby, die ich kenne, viel besser und tiefer, können Sie Elemente in Array Karte und das Rück neue und Bedingung Rückkehr von if-Anweisung. Ich habe mich gefragt, ob es so etwas in JS gibt, ich bin gerade dabei, Array durchzulaufen und jedes Element mit anderen zu vergleichen, aber es ist nicht der performanteste Weg. Ich möchte wie etwas tun:

let newArray = myArray.map((a,b) => { if (a.date === b.date) { return {text1: a.caption, text2: b.caption}}});

So wäre führen:

[ 
    {text1: "text_1", text2: "text_4"}, 
    {text1: "text_2", text2: "text_3"} 
] 

Hat so etwas, etwas eleganter als auch performant existiert?

Dank ...

+0

die so klicken Sie '<>' Snippet-Editor und erstellen Sie eine [mcve], dann können wir besser helfen – mplungjan

+0

var result = array.filter (i => i.date == date); –

+0

Nicht wirklich für 'map()' da du nur bedingt zurückkommst. Das resultierende Array hat immer noch die gleiche Länge wie das Original, ist aber voller Löcher – charlietfl

Antwort

1

Die Antwort auf Ihre Frage ist:
Nein, es gibt keine Funktionalität in JavaScript, das vollbringt, was Sie als elegant wollen, wie Sie (nicht sicher performant) wünschen.

für Ihren speziellen Anwendungsfall, würde ich einfach ein neues Objekt erstellen, das das Datum als Schlüssel verwendet und sammelt die verschiedenen Beschriftungen, konvertiert dann das Objekt in ein Array:

const collected = {}; 

myArray.forEach((entry) => { 
    if (entry.date in collected) { 
     collected[entry.date].text2 = entry.caption; 
    } else { 
     collected[entry.date] = { text1: entry.caption }; 
    } 
}); 

const newArray = Object.keys(collected).map(key => collected[key]); 
+0

Am Ende änderte ich meinen Ansatz und konzierte die Arrays nicht. Ich bin Ihrer Herangehensweise gefolgt und habe sie ein wenig an meine Verwendung angepasst und sie hat sich in viel schnellerer Datenverarbeitung aufgelöst. Danke für den tollen Vorschlag. –

Verwandte Themen