2017-01-26 1 views
1

ich mehr SVG Polylinien aus einer Struktur erzeugen will zu erzeugen, die ich habe:ES6/Typoskript Weise eine Polylinie aus einem Array

data = [item0, item1, ...., item50] 
item0 = {y1: 10, y2: 100, ...[other properties]...} 
item1 = {y1: 1000, y2: 50, ...} 
item2 = {y1: 500, y2: 40, ...} 

So ist die Struktur eine Reihe von Objekten, von denen ein Element mehr Y-Wert hat . Der x-Wert wird durch Iterieren über die Struktur (x * 10) bestimmt.

Der Ausgang ein String für jeden "y" sein sollte, wie folgt aus: "x0, y1 [0] x1, y1 [1] x2, y1 [2] ..."

polyLine1 = "0,10 10,100 20,500..." 
polyLine2 = "0,1000 10,50 20,40 ..." 

I tun sie es mit Underscore.js oder etwas ähnliches wie diese können:

polyLine1 = ""; 
_.each (data, function(item, index){ 
    polyLine1 += "" + index*10 + "," + item.y1 
} 
polyLine2 = ""; 
_.each (data, function(item, index){ 
    polyLine2 += "" + index*10 + "," + item.y2 
} 

Was ich suche ist ein intelligenter Weg, um eine vollständige Ausgabestruktur mit Lambda/Pfeil-Syntax zu initialisieren:

this.polyLines = { 
    polyLine1 = ...,// iterate data, pick y1 property, map x and y, reduce/join to a string 
    polyLine2 = ..., 
} 

Als Referenz verwende ich TypeScript mit Ionic2 (Angular2). Ich weiß, dass ich das mit Template-Bindings machen kann (was wahrscheinlich langsamer und weniger lesbar wäre), aber ich möchte nur lernen.

+0

Gibt es eine Möglichkeit, reale Daten anzuzeigen? Ich würde etwas mehr erwarten wie 'data = [{y1: 10, y2: 100}, {y1: 11, y2: 101}]', und dann was genau das erzeugen sollte, weil Sie zuerst sagen, dass Sie eine Saite wollen, aber dann hast du diese "Linien" -Struktur ... –

+0

Ich bekomme ein paar ADC-Werte von einer Platine durch serielle, jede Sekunde oder so. Diese reichen von 0 bis 1024. Ich möchte die letzten 50 von denen auf einem Diagramm anzeigen. Linien bedeuten Polylinien, eine für jeden ADC-Eingang. – brainwash

+0

Ich gehe hier meta, aber ich verstehe nicht, warum irgendjemand das ablehnen würde. Es ist eine Frage des Konvertierens eines "alten" Unterstreichungsstils "subscore.js" in einen neueren lambda-basierten Stil. Die Tags svg und polylines waren Vorschläge, die ich genehmigt habe. – brainwash

Antwort

2

Dies produziert, was ich denke, dass Sie suchen. Grundsätzlich ist reduce (von ES5.1) was Sie wollen. Ich verwende Lambdas (arrow functions) und template literals von ES6 zusammen mit String.prototype.trim() und Object.keys() von ES5.1.

let data = [{ 
 
    y1: 10, 
 
    y2: 100 
 
}, { 
 
    y1: 1000, 
 
    y2: 50 
 
}] 
 
let keyReduction = (b) => Object.keys(b).reduce((c, d, x) => c += `${x*10} ${b[d]} `, ""); 
 
let polyLines = data.reduce((a, b, i) => { 
 
    a[`polyLine${i+1}`] = keyReduction(b).trim(); 
 
    return a; 
 
}, {}); 
 
console.log(JSON.stringify(polyLines))

Ich bin mir nicht sicher, ob die für Polylinien arbeiten, wie ich eine SVG nicht getan haben, aber ich bin sicher, dass Sie es zwicken können an Ihre Bedürfnisse anzupassen.

Sieht aus, als ob Sie Kommas brauchen. Sie können den gleichen Code tun, sondern mit einem Komma:

let data = [{ 
 
    y1: 10, 
 
    y2: 100 
 
}, { 
 
    y1: 1000, 
 
    y2: 50 
 
}] 
 
let keyReduction = (b) => Object.keys(b).reduce((c, d, x) => c += `${x*10},${b[d]} `, ""); 
 
let polyLines = data.reduce((a, b, i) => { 
 
    a[`polyLine${i+1}`] = keyReduction(b).trim(); 
 
    return a; 
 
}, {}); 
 
console.log(JSON.stringify(polyLines))

Hier ist ein weiteres Beispiel, jeden Eigenschaftsnamen in eine separate Eigenschaft der endgültigen Ausgabe Ausbrechen:

let data = [{ 
 
    y1: 10, 
 
    y2: 100 
 
}, { 
 
    y1: 1000, 
 
    y2: 50 
 
}] 
 
let polyLines = data.reduce((a, b, i) => { 
 
    Object.keys(b).forEach((k) => { 
 
    a[k] = (a[k] || "") + (i * 10) + "," + b[k] + " "; 
 
    }); 
 
    return a; 
 
}, {}); 
 
console.log(JSON.stringify(polyLines))

+0

Wow, das ist großartig, mehr als ich verlangen könnte. Ich wollte nicht alle Teilfelder automatisch bearbeiten, aber es ist ein netter Trick in der Tasche. – brainwash

+0

Ich habe die Frage bearbeitet anstatt hier einen Kommentar abzugeben. Der Code, den Sie zur Verfügung gestellt haben, ist nett, tut aber nicht, was ich will, es war mein Fehler, wie die Anforderung formuliert wurde. Wenn Sie so freundlich wären, eine alternative Antwort zu geben, wäre ich dankbar. Ich habe hier ein Jsfiddle erstellt: https://jsfiddle.net/42b8uown/ mit einigen echten Daten, aber es könnte Probleme mit der Implementierung von Typoskript geben. – brainwash

+0

Ja, ich weiß nicht, was mit dem TypeScript dort los ist. Wenn man sich das gerenderte JavaScript anschaut, sieht es so aus, als sei es halb fertig: 'acc [(' 'polyLine $ {+ Zeile)] = i +}, $ {+ item.sensorValue;' –

Verwandte Themen