2016-06-18 9 views
0

Ich habe dieses JSONWie zu verändern Array innerhalb eines Objekts

{ 
    "Entries": [{ 
     "JobId": 7322, 
     "DayOfTheWeek": "Wednesday", 
     "Punchouts": ["2016-05-05T09:50:00", "2016-05-05T12:20:00"], 
     "PunchIns": ["2016-05-05T10:10:00", "2016-05-05T12:40:00"] 
    }, { 
     "JobId": 7322, 
     "DayOfTheWeek": "Thursday", 
     "Punchouts": ["2016-05-05T09:50:00"], 
     "PunchIns": ["2016-05-05T09:40:00"] 
    }] 
} 

ich es

{ 
    "Entries": [{ 
     "JobId": 7322, 
     "DayOfTheWeek": "Wednesday", 
     "Punchout1": "2016-05-05T09:50:00", 
     "Punchout2": "2016-05-05T12:20:00", 
     "PunchIn1": "2016-05-05T10:10:00", 
     "PunchIn2": "2016-05-05T12:40:00" 
    }, { 
     "JobId": 7322, 
     "DayOfTheWeek": "Thursday", 
     "Punchout1": "2016-05-05T09:50:00", 
     "Punchout2": "", 
     "PunchIn1": "2016-05-05T09:40:00" 
     "PunchIn2": "", 
    }] 
} 

ändern würde ich möchte das Array kondensieren. Das Array max Länge = 2. Selbst wenn die Länge 0/1 ist, sollte das Array leere Zeichenfolge für PunchOut1/PunchOut2 und PunchIn1/PunchIn2

es wie folgt implementiert.

for (var i = 0; i < data.Entries.length; i++) { 
    var entry = data.Entries[i]; 
    if (entry["Punchouts"].length == 0) { 
     entry["PunchOut1"] = ""; 
     entry["PunchOut2"] = ""; 
    } 
    if (entry["Punchouts"].length == 1) { 
     entry["PunchOut1"] = entry["Punchouts"][0]; 
     entry["PunchOut2"] = ""; 
    } 
    if (entry["Punchouts"].length == 2) { 
     console.log("in"); 
     entry["PunchOut1"] = entry["Punchouts"][0]; 
     entry["PunchOut2"] = entry["Punchouts"][1]; 
    } 
    delete entry["Punchouts"]; 
    // do same for PunchIns. 
} 

Fiddle: https://jsfiddle.net/codeandcloud/rpgx28gy/

Was wäre eine optimierte (lodash vorzugsweise) Art und Weise?

+0

Wenn Sie nach Optimierungen fragen, suchen Sie nach präziseren Code oder nach Speicher und/oder CPU-Optimierung? – Alpha

+0

Ihre gewünschte Ausgabe ist nicht "kondensiert" - es ist eigentlich * mehr * Zeichen. – nnnnnn

+0

@Alpha: lesen optimiert als besser lesbar, weniger Code. – naveen

Antwort

1
var remappedEntries = _.map(data.Entries, e => ({ 
    JobId: e.JobId, 
    DayOfTheWeek: e.DayOfTheWeek, 
    PunchOut1: e.PunchOuts[0] || "", 
    PunchOut2: e.PunchOuts[1] || "", 
    PunchIn1: e.PunchIns[0] || "", 
    PunchIn2: e.PunchIns[1] || "", 
})); 

Dies verwendet lodash der Karte, die durchläuft jeden Wert und gibt Ihnen eine iteratee Funktion, die Sie diesen Eintrag re-map auf ein anderes Objekt verwenden können. Beachten Sie, dass Sie hierfür überhaupt keine lodash verwenden müssen. Sie können die Array.prototype.map-Funktion verwenden, vorausgesetzt, die Browser, die Sie unterstützen möchten. Es gibt auch Shims, die Sie verwenden können.

Wenn Sie anstelle einer Kopie das exakt gleiche Objekt ändern möchten, können Sie _.forEach verwenden oder die Karte weiterhin verwenden und das vorherige Objekt verwerfen. Kommt wirklich auf Ihren Fall an.

Ich habe auch Pfeilfunktionen verwendet, die es einfacher machen, von jedem "e" zu dem Objekt, das Sie zurückgeben möchten. Alternativ könnte dies eine benannte oder eine anonyme Funktion sein, die einen Parameter benötigt.

Für jeden Punchout nutze ich den Vorteil, dass Sie ein Array überprüfen können, auch wenn es dort kein Objekt gibt. In diesem Fall wird es undefiniert zurückgegeben. Für diese setzen wir sie auf eine leere Zeichenfolge, indem wir die Bedingung oder verwenden, weil undefiniert als "Falsy" betrachtet wird und der Ausdruck die leere Zeichenfolge zurückgibt. Wenn es einen Wert hätte, würde es diesen Wert verwenden.

+0

Das 'e.PunchOuts [0] || "" Mechanismus ist genau das, was ich über http://codereview.stackexchange.com/q/132412/1366 vorgeschlagen hätte, aber Sie haben mir die Probleme erspart. Gute Arbeit. – nnnnnn

+0

danke. https://jsfiddle.net/codeandcloud/rpgx28gy/1/ – naveen