6

BenYolları

var obj = { 
    animal: "${animal}" 
}; 

var res = magic(obj, {animal: "cat"}); 

// res => {animal: "cat"} 

magic aşağıdaki yapmak istiyorum nesneleri kirli işlerini yapan bazı fonksiyonudur. Açıkça obj, birden çok tuş, iç içe geçmiş diziler vb. Ile daha karmaşık olabilir. Şablon değişkeni bu

var obj = { 
    animals: ["cat", "dog", "${animal}", "cow"] 
}; 

gibi bir dizi içinde olabilir ve her yerde bu kadar basit obj.animals[2] = "bat"; yapıyor dizide mümkün değildir olabilir.

İstediğim şeyi alabildiğim underscore-tpl library'u buldum, ancak gelecekteki başvurular için başka çözümler olup olmadığını bilmek istiyorum ve çünkü ilk etapta alt-çizgi bulmakta zorlandım.

Benim asıl kullanım örneği ben JSON.parse(...) kullanarak bu consig.json ayrıştırmak aşağıdaki

{ 
    "task1": { 
    "command": "command-line-program", 
    "args": [ 
     "--input", "{{input}}", 
     "--flag1", 
     "--output", "{{output}}", 
     "--flag2", 
    ], 
    "options": { 
     "cwd": "path-to-working-dir" 
    } 
    } 
} 

gibi çeşitli bildirimleri var bir config.json dosyası var ve ben command, args ile require("child_process").spawn dediğimiz olmasıdır ve dosyada bildirilen options parametreleri, ancak args çok fazla, bayrak eklenmiş, yeniden düzenlenmiş ve malzeme değiştirir, bu nedenle yapmak spawn çağırır kodu değiştirmeyi içerir ve bu alırken hataya eğilimli olduğunu.

Güncelleme

benim projelerde içerebilir basit bir paket (located here) oluşturuldu, bunu kullanmaktan çekinmeyin ettik the accepted answer dayanarak.

function magic(o, a) { 
    var j = JSON.stringify(o); 
    for (var k in a) { 
      j = j.split('${'+k+'}').join(a[k]); 
    } 
    return JSON.parse(j); 
} 
+1

Neden sadece "hayvan: res.animal" değil? Daha büyük bir dizenin ortasındaki enterpolasyona ihtiyacınız varsa, ES2015 [şablon dizgileri] (http://es6-features.org/#StringInterpolation) kontrol edin. * edit * oh Tamam Ne çektiğini görüyorum. – Pointy

+0

JS şablon motorlarını arayın. Site dışı kaynakların, kütüphanelerin, vb. Sorulmasının aslında OT için OT olduğunu unutmayın. –

+0

@DaveNewton Peki, bu her zaman en iyisi değil, SADECE soruyu itiraf ediyorum :) Gerçekten sadece bir şey koymak istedim, böylece ben (ve diğerleri) daha kolay bulabilirdim, çünkü zor bir zaman buldum Bunun için ağrısız bir çözüm. –

cevap

2

Daha sonra sonra, gerçek değeri ile JSON.parse Arama değerini değiştirin sonuç nesnesini JSON.stringify olabilir simple-template.js

Bu 22 satırlık koddan oluşur, çok basit! Bunu göz önüne alarak, yapılandırmanızı kolayca oluşturabileceksiniz!

+0

Bu gibi bir şey denedim, yalnızca tüm config.json'umda "arama ve değiştirme" ifadelerini kullanan regex'lerle. JSON için dize ayrıştırma sırasında kaçan teklifleri şeyler ile sorunları vardı, ama genel olarak, evet evet bu işe yarar :) –

+1

Eh, öneri ile kaldı ettik çünkü bu daha kolay olamazdı. Buna dayanarak bir paket oluşturdum [https://github.com/kohanyirobert/tplobj]. Kodu güncelledim, böylece bir [k] 'düzgün bir şekilde kaçtı. Şimdiye kadar benim için çalışıyor. Fikir için teşekkürler! –

+0

Bu çözüm beklenmedik bir şekilde kırılmaya mahkum görünüyor, çünkü a dizisindeki dizelerden kaçmıyor. (YaniBasit test senaryoları üzerinde çalışacak, ancak bir teklif veya ters eğik çizgi veya somesuch içeren bir dize aldığınızda üretime ara verin. –

1

Sana çok basit ama çok hızlı ve anlaşılabilir şablon motor hissi: