2016-12-08 2 views
-1

Kann jemand einen besseren Weg vorschlagen, so etwas wie die folgenden zu tun:Javascript Objekte verschmelzen

setData(start, end, country, person, type, data){ 
    this.cachedData[start] = this.cachedData[start] ? this.cachedData[start] : {}; 
    this.cachedData[start][end] = this.cachedData[start][end] ? this.cachedData[start][end] : {}; 
    this.cachedData[start][end][country] = this.cachedData[start][end][country] ? this.cachedData[start][end][country] : {}; 
    this.cachedData[start][end][country][person] = this.cachedData[start][end][country][person] ? this.cachedData[start][end][country][person] : {}; 
    this.cachedData[start][end][country][person][type] = data; 
    } 
+1

Leider ist SO nicht wirklich für Vorschläge für Code, der funktioniert. Was Sie tun sollten, ist zu versuchen, eine bessere Lösung zu finden, wahrscheinlich mit Rekursion. Wenn es nicht funktioniert, poste, was du versucht hast; das passt besser in dieses Forum –

+0

Sehen Sie sich https://www.npmjs.com/package/object-merge zur Inspiration an. Ich denke nicht, dass es genau das tut, was Sie brauchen, aber es sollte Ihnen einen Vorsprung geben –

+1

Schreiben Sie eine generische Funktion zum Festlegen/Abrufen (verschachtelter) Eigenschaften für ein Objekt. Beachten Sie auch, dass dies mit JSON überhaupt nichts zu tun hat. JSON ist eine * textuelle * Datendarstellung. –

Antwort

2

Sie es, indem Sie eine Variable ein bisschen mehr Generika machen könnte Anzahl der Argumente (ES6):

class X { 
 
    constructor() { 
 
     this.cachedData = {}; 
 
    } 
 
    setData(...args){ 
 
     var obj = this.cachedData; 
 
     var [key, data] = args.splice(-2, 2); 
 
     for (var prop of args) { 
 
      obj = obj[prop] = obj[prop] || {}; 
 
     } 
 
     obj[key] = data; 
 
    } 
 
} 
 

 
x = new X(); 
 
x.setData('2016', '2017', 'Germany', 'Jack', 'green', 'light'); 
 
x.setData('2016', '2017', 'Germany', 'Helen', 'red', 'dark'); 
 
console.log(x.cachedData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

Hier ist eine Möglichkeit:

function setData (start, end, country, person, type, data){ 
    var data_path = [start, end, country, person]; 
    var person = data_path.reduce(function (ref, prop) { 
     return ref[prop] = ref[prop] || {}; 
    }, this.cachedData); 
    person[ type ] = data; 
} 
0

Sie können es in eine Schleife einfügen und im Falle von undefined oder null können Sie {} ersetzen. Ich sehe keinen anderen Weg.

Jeder hat einen?