2011-01-20 10 views
18

Sono stanco di scrivere questo:qualcosa di simile in javascript per Ruby # {valore} (stringa interpolazione)

string_needed = "prefisso ....." + argomento + "il suffisso ...." + nome + "test";

vorrei pensare che qualcuno avrebbe potuto fare qualcosa per questo, ormai;)

+0

meglio fare una scorciatoia per allora, questa sintassi non andrà da nessuna parte per un po '. ;) Il meglio che si possa fare è qualcosa come una funzione 'sprintf', ma ciò non renderà le cose più brevi. – deceze

+1

Vedere la risposta più votata nella domanda duplicata. – Phrogz

+1

ECMAscript 6 ha stringhe di template ... quindi sì, in futuro sarai in grado di fare \ 'string testo $ {espressione} stringa di testo \': https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/template_strings – Ajedi32

risposta

18

dispiace :(

mi piace approfittare di Array.join:

["prefix ....", topic, "suffix....", name, "testing"].join("") 

o l'uso String.concat

String.concat("a", 2, "c") 

o si può scrivere la propria funzione concatenate:

var concat = function(/* args */) { 
    /* 
    * Something involving a loop through arguments 
    */ 
} 

o utilizzare un 3rd-party sprintf funzione, come http://www.diveintojavascript.com/projects/javascript-sprintf

+0

+1 per Array.join. Il metodo più veloce per fare ciò che troverai (è anche molto più veloce della concatenazione di stringhe raw). – Reid

+2

@Reid posso suggerire questo? http://blogs.sitepoint.com/2010/09/14/javascript-fast-string-concatenation/;) – Couto

+0

Stavo per dire ... Nonostante questa tecnica abbia ottenuto molta attenzione, l'unione # di join è * non * più veloce della concatenazione di stringhe in molti casi. –

10

Si potrebbe considerare l'utilizzo di coffeescript per scrivere il codice (che ha interpolazione come Ruby cioè # {foo}).

E 'compila' fino a javascript - così si finirà con javascript, come quello che hai scritto, ma senza la necessità di scrivere/mantenere il codice +++ siete stanchi di

mi rendo conto quello che ti chiede di considerare un'altra lingua è sul bordo di essere una risposta valida o meno, ma considerando il modo in cui funziona il coffeescript, e che uno dei tuoi tag è Ruby, spero che passi.

7

Come curiosità Javascript, è possibile implementare qualcosa che fondamentalmente fa Ruby-simile interpolazione:

sub = function(str) { 
    return str.replace(/#\{(.*?)\}/g, 
    function(whole, expr) { 
     return eval(expr) 
    }) 
} 

js> y = "world!" 
world! 
js> sub("Hello #{y}") 
Hello world! 
js> sub("1 + 1 = #{1 + 1}") 
1 + 1 = 2 

Usandolo su qualsiasi cosa, ma letterali stringa è in cerca di guai, ed è probabilmente abbastanza lento in ogni modo (anche se Non ho misurato). Ho pensato di farti sapere.

1

Risposta diretta: No javascript non supporta l'interpolazione delle stringhe.

L'unico modo è di implementarlo da soli o utilizzare un lib di terze parti che lo fa per te.

EDIT

Come Marcos aggiunto commenti C'è una proposta di ECMAScript 6 (Harmony), in modo che possiamo avere una corretta interpolazione stringa:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`); 
// "Fifteen is 15 and 
// not 20." 

Si prega di visualizzare ulteriori informazioni here.

+2

Questo è cambiato. Ora c'è un modo migliore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings Portare nel 2015 a JS quello che molte lingue come Ruby e PHP hanno già goduto. Né questa domanda né il suo SO "duplicato" stanno permettendo risposte più nuove .... così tristi. – Marcos

+0

@Marcos Grazie per averlo indicato. –

0

Ho appena scritto questa funzione hacky per farlo.L'uso è la seguente:

interpolate("#{gimme}, #{shelter}", {gimme:'hello', shelter:'world'}) 
// returns "hello, world" 

e l'implementazione:

interpolate = function(formatString, data) { 
    var i, len, 
     formatChar, 
     prevFormatChar, 
     prevPrevFormatChar; 
    var prop, startIndex = -1, endIndex = -1, 
     finalString = ''; 
    for (i = 0, len = formatString.length; i<len; ++i) { 
     formatChar = formatString[i]; 
     prevFormatChar = i===0 ? '\0' : formatString[i-1], 
     prevPrevFormatChar = i<2 ? '\0' : formatString[i-2]; 

     if (formatChar === '{' && prevFormatChar === '#' && prevPrevFormatChar !== '\\') { 
      startIndex = i; 
     } else if (formatChar === '}' && prevFormatChar !== '\\' && startIndex !== -1) { 
      endIndex = i; 
      finalString += data[formatString.substring(startIndex+1, endIndex)]; 
      startIndex = -1; 
      endIndex = -1; 
     } else if (startIndex === -1 && startIndex === -1){ 
      if ((formatChar !== '\\' && formatChar !== '#') || ((formatChar === '\\' || formatChar === '#') && prevFormatChar === '\\')) { 
       finalString += formatChar; 
      } 
     } 
    } 
    return finalString; 
}; 
Problemi correlati