2013-06-10 2 views
0

내가 레일에 루비에 너무 많은 간단한 기능의 존재를 그리워 매개 변수 당신이 uggly 하드 코드를 만드는 많은 문자열을 요약해야 자바 스크립트에서자바 스크립트 문자열은

"the key '%{key}' has a value of '%{value}'" % {:key => 'abc', :value => 5} 

쓰다.

거기에 좋은 라이브러리가 있습니까? 나는 sprintf와 같은 것에 관심이 없다.

+0

무엇 [수염]와 같은 템플릿 엔진 (약 https://github.com/를 janl/mustache.js)? – bfavaretto

+1

이것은 미세 최적화 문제입니다. 내 생각에 좀 더 구체적인 것에 집중하십시오. –

+0

[밑줄 템플릿] (http://underscorejs.org/#template)이 있지만 과장 될 수 있습니다. – Andbdrew

답변

3
String.prototype.format = function(obj) { 
    return this.replace(/%\{([^}]+)\}/g,function(_,k){ return obj[k] }); 
}; 

"the key '%{key}' has a value of '%{value}'".format({ key:'abc', value:5 }); 
+1

네이티브 "".format가 doug crockford에 의해 ecma6에 대한 docket에 있기 때문에 다른 어떤 것으로 불러야합니다 ... – dandavis

0

당신은 기본 배열 형 포맷터 만들 수 :

String.prototype.format = function(args) { 
    var str = this, 
     idxRx = new RegExp("{[0-9]+}", "g"); 
    return str.replace(idxRx, function(item) { 
     var val = item.substring(1, item.length - 1), 
      intVal = parseInt(val, 10), 
      replace; 
     replace = args[intVal]; 
     return replace; 
    }); 
}; 

사용법 :

'{1} {0} and {2}!'.format(["collaborate", "Stop", "listen"]) 
// => 'Stop collaborate and listen!' 
+0

모든 것을'return this.replace (/ \ {(\ d +) \} '로 줄일 수 있습니다./g, function (_, n) {return args [+ n]});'. 보통 당신은'arguments' 배열을 사용하여이 작업을 수행 할 수 있습니다. 따라서 무한 개수의 인수를 전달하고 추가 배열을 사용하는 대신 자리 표시 자에 매핑 할 수 있습니다. – elclanrs