2016-08-11 3 views
0

Ich habe ein Objekt-Array als dies:JavaScript: Wie kann ich Objekte Array A in Objekte Array B in der Effizienz Weise transformieren?

[ 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Voltage", 
     "Value": "230.12" 
    }, 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Frequency", 
     "Value": "50.12" 
    }, 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Power", 
     "Value": "23" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Voltage", 
     "Value": "231.12" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Frequency", 
     "Value": "51.12" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Power", 
     "Value": "23.4" 
    } 
] 

I Array B, da dies zum Objekt zu transformieren will:

[ 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Voltage": "231.12", 
     "Frequency": "51.12", 
     "Power": "23.4" 
    } 
] 

Ich war Looping den Zeitstempel und Re-Schleife wieder zu bekommen Label zu erhalten und Wert, um ein neues Objekt-Array zu bilden. Es funktioniert, aber wenn die Daten einige hunderttausend Objekt-Array werden, dann ist es nicht effizient und den Browser abstürzen. Kann mir jemand einen besseren Weg vorstellen? Vielen Dank.

+3

Warum sind Sie setzen zusammen, um die Daten aus verschiedenen Zeitstempel (2015.10.02 22.22.22 und 2015.10.02 00.00.00)? – Bergi

+0

Ist Ihre Eingabe nach dem Zeitstempel sortiert? Wenn ja, ist es in einem einzigen Durchgang trivial. – Bergi

+0

pls erklären Sie Ihre Funktionalität mehr. Wie machst du Array B? – ajaykumar

Antwort

1

JSON ist nur ein Transport-/Speicherformat. Es ist im Allgemeinen nicht etwas, das Sie direkt manipulieren sollten. Am besten manipulieren Sie die eigentlichen JavaScript-Objekte/Arrays.

Wenn Sie das Original-Array Sortierreihenfolge garantieren können, versuchen Sie so etwas wie dieses:

var outputArray = []; 
var currentObj = null; 
originalArray.forEach(function (measurement) { 
    if (!currentObj || currentTimestamp !== measurement.Timestamp) { 
    currentTimestamp = measurement.Timestamp; 
    currentObj = { 
     Timestamp: measurement.Timestamp; 
    } 
    outputArray.push(currentObj); 
    } 
    currentObj[measurement.Label] = measurement.Value; 
}); 

Dann können Sie nur eine Schleife durch und das neue Array zu bauen, wie Sie gehen.

+0

Hallo Brad, du hast auch gearbeitet! Sowohl Sie als auch DAX-Skripte sind besser als meins. Vielen Dank, ich werde es heute mit hunderttausenden von Daten testen und Sie wissen lassen. Danke noch einmal. https://jsfiddle.net/51r7onnm/ –

+0

Überraschenderweise vergleichen die Verwendung von foreach und generischen Timestamp viel schnellere Antwort als array.reduce Methode, wenn ich hunderttausende von Datenpunkten mit Zeitstempel werfe. Und ein b reduzieren sieht sehr ordentlich und geradlinig aus! Um ehrlich zu sein ist es ziemlich weit fortgeschritten für mich, wenn ich sehe, dass DAX die Pfeilfunktion benutzt. Vielen Dank! Ihr seid Genie! Ich habe viel von deinem Schnipsel gelernt. –

1

Wie Sie die gewünschten Ausgabe zeigte die Zeit des Zeitstempels zu ignorieren dies, dass ein Teil des Zeitstempels trimmt - wenn das ein Fehler in der Frage war, ich glaube, Sie sollten sich, dass ein Teil zu entfernen, die Lage sein,

var b = a.reduce((acc, cur) => { 
    var strippedTimestamp = cur.Timestamp.substring(1, 10) + " 00:00:00"; 
    var obj = acc.find(e => e.Timestamp == strippedTimestamp); 
    if (!obj) { 
    obj = { Timestamp: strippedTimestamp }; 
    acc.push(obj); 
    } 
    obj[cur.Label] = cur.Value; 
    return acc; 
}, []); 

ausgibt

[ 
    { 
     "Timestamp": "015-10-01 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    }, 
    { 
     "Timestamp": "015-10-02 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    } 
] 
+0

Danke DAX, dein Code funktioniert für mich, außer dass ich den entfernten Zeitstempel entfernt habe. Sorry es waren meine Tippfehler über den Timestamp, ja die Maschine gibt mir jeden Datenpunkt mit Timestamp zurück aber das Frontend Display möchte sie nach Timestamp gruppieren. https://jsfiddle.net/ow2d6f72/ –