2016-08-06 14 views
0

ich eine json Vorlage haben wie folgt aus:json Template-Engine in node.js

[ 
    { 
    "type":"foo", 
    "config":"{config}" 
    }, 
    { 
    "type":"bar", 
    "arrConfig":"{arrConfig}" 
    } 
] 

Während ich habe ein Trägermodell wie:

{ 
    "config": { 
    "test1": "value1", 
    "test2": "value2" 
    }, 
    "arrConfig": [ 
    "test3": { 
     "key1": "val1" 
    }, 
    "test4": { 
     "key1": "val1" 
    } 
    ] 
} 

Ich frage mich, ob es einen Knoten sind Module da draußen, die automatisch diese beiden übernehmen und die Platzhalter in der Vorlage transformieren. So würde die Ausgabe wie folgt aussehen:

[ 
    { 
    "type":"foo", 
    "config":{ 
     "test1": "value1", 
     "test2": "value2" 
    } 
    }, 
    { 
    "type":"bar", 
    "arrConfig": [ 
     "test3": { 
     "key1": "val1" 
     }, 
     "test4": { 
     "key1": "val1" 
     } 
    ] 
    } 
] 
+0

Ich meine eine quick & dirty Lösung auf dem JSON Textersetzung nur tun würde verwenden. Sie könnten Ihre eigene Funktion schreiben, um eine Objekthierarchie rekursiv zu durchlaufen und übereinstimmende Textwerte zu ersetzen. – qxz

+0

Ich denke, es ist ein bisschen komplexer, da die Platzhalter Werte ein Objekt, Array, String, Nummer usw. sein können ... Also entsprechend muss ich es ersetzen – user320550

Antwort

1

Hier ist eine Funktion, eine Objekthierarchie und ersetzen Vorlage Strings zu durchqueren, wie angegeben:

// modifies the object passed, and returns the same object 
 
function applyTemplate(template, backing) { 
 
    for (var i in template) { 
 
    var m = /^{(.+)}$/.exec(template[i]); 
 
    if (m && backing[m[1]]) { 
 
     // replace with a deep clone of the value from the backing model 
 
     template[i] = JSON.parse(JSON.stringify(backing[m[1]])); 
 
    } else if (template[i] && "object" == typeof template[i]) { 
 
     // traverse down recursively 
 
     applyTemplate(template[i], backing); 
 
    } 
 
    } 
 
    return template; 
 
} 
 

 
var template = [ 
 
    { 
 
    "type":"foo", 
 
    "config":"{config}" 
 
    }, 
 
    { 
 
    "type":"bar", 
 
    "arrConfig":"{arrConfig}" 
 
    } 
 
]; 
 

 
var backing = { 
 
    "config": { 
 
    "test1": "value1", 
 
    "test2": "value2" 
 
    }, 
 
    "arrConfig": { 
 
    "test3": { 
 
     "key1": "val1" 
 
    }, 
 
    "test4": { 
 
     "key1": "val1" 
 
    } 
 
    } 
 
}; 
 

 
applyTemplate(template, backing); 
 
console.log(JSON.stringify(template, null, 2));

Plus ist ein Proof-of Konzept mit rohen JSON-Text-Ersatz (nicht robust, verwenden Sie nicht diese; funktioniert aber für die überwiegende Mehrheit der Szenarien):

function applyTemplateStr(template, backing) { 
    template = JSON.stringify(template); 
    for (var key in backing) { 
    template = template.split('"{'+key+'}"').join(JSON.stringify(backing[key])); 
    } 
    return JSON.parse(template); 
} 
2

JSON.stringify akzeptiert einen Ersatzparameter, den Sie verwenden könnten.

sollte diese Arbeit:

var template = [ 
    { 
    "type":"foo", 
    "config":"{config}" 
    }, 
    { 
    "type":"bar", 
    "arrConfig":"{arrConfig}" 
    } 
]; 


var data = { 
    "config": { 
    "test1": "value1", 
    "test2": "value2" 
    }, 
    "arrConfig": { 
    "test3": { 
     "key1": "val1" 
    }, 
    "test4": { 
     "key1": "val1" 
    } 
    } 
}; 

var replacer = function (key, val) { 
    if (typeof val === 'string' && val.match(/^{(.+)}$/)) { 
    return data[val.replace(/[{|}]/g, '')] 
    } 
    return val; 
} 

console.log(JSON.stringify(template, replacer)); 

Und wenn Sie es zurück in ein Objekt verwandeln möchten, können Sie JSON.parse