Come inserisco le variabili nelle stringhe javascript? (Node.js)


147
s = 'hello %s, how are you doing' % (my_name)

Ecco come lo fai in Python. Come puoi farlo in javascript / node.js?


1
Sono sicuro che ci sarebbe stato un altro uomo di paglia da qualche parte per farevar s = 'hello ${my_name}, how are you doing';
Raynos,

1
Uso come diceva Raynos: const poem = "Il fiume nero"; const autore = "Joseph Troll"; const favePoem = `La mia poesia preferita è $ {poem} di $ {author} \.`; Oppure puoi usare: console.log ('% s is% d.', 'Eleven', 11);
Gilberto B. Terra Jr.

Risposte:


56

Se vuoi avere qualcosa di simile, puoi creare una funzione:

function parse(str) {
    var args = [].slice.call(arguments, 1),
        i = 0;

    return str.replace(/%s/g, () => args[i++]);
}

Uso:

s = parse('hello %s, how are you doing', my_name);

Questo è solo un semplice esempio e non tiene conto di diversi tipi di tipi di dati (come %i, ecc.) O di escape %s. Ma spero che ti dia qualche idea. Sono abbastanza sicuro che ci siano anche librerie là fuori che forniscono una funzione come questa.


1
Questo è fondamentalmente il migliore che otterrai dal momento che non è supportato direttamente dalla lingua in quanto è in Python.
Jim Schubert,

L'altra risposta, che presenta util.format (), dovrebbe essere la risposta accettata ... sebbene preferibilmente menzionerebbe anche le stringhe di template di ES6 (che certamente non esistevano nel 2011). Dovremmo davvero essere in grado di dirottare wiki vecchie domande per tenerle aggiornate. : \
Kyle Baker,

1
@FelixKling, poiché sei la risposta accettata, potresti semplicemente aggiornare la tua risposta per indicare gli altri usi corretti?
Kyle Baker,

1
Questo è carino, i letterali modello non sono esattamente la stessa cosa
evangelista

Ho riscontrato un problema durante l'utilizzo di "argomenti". Quando più client sono passati dall'analisi, lo "str" ​​è stato confuso. Alcuna spiegazione?
tspentzas,

406

Con Node.js v4è possibile utilizzare le stringhe modello di ES6

var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing

È necessario avvolgere la stringa all'interno del backtick ` anziché'


1
Plus 1 Perché siamo nel 2017 e ES6 è sostanzialmente standard nel mondo dei nodi.
Jankapunkt,

1
Questa è ora (2017) la risposta corretta. Tieni presente che avrai bisogno di Babel nella tua toolchain per supportare i browser più vecchi.
Superluminario,

3
Ho suggerito agli sviluppatori di node.js che sarebbe davvero utile chiarire su pagine come nodejs.org/api/readline.html che si tratta di un backtick. Si è verificato un problema qui: github.com/nodejs/docs/issues/55
Gail Foad,

Mi sono innamorato dei trappole, grazie per il commento;)
Overdrivr

3
Cosa succede se la mia stringa fa parte del file di configurazione hello ${my_name}, how are you doinge desidero assegnare la variabile in modo dinamico dopo aver letto la stringa dalla configurazione?
Amreesh Tyagi,


43

A partire da node.js >4.0quando diventa più compatibile con lo standard ES6, dove la manipolazione delle stringhe è notevolmente migliorata.

La risposta alla domanda originale può essere semplice come:

var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '

Laddove la stringa può diffondere più righe, rende piuttosto semplici modelli o processi HTML / XML. Maggiori dettagli e maggiori capacità al riguardo: i letterali template sono letterali stringa su mozilla.org.


3
"inclina" invece di una virgoletta "" risparmia il giorno di maggio :)
Mario Binder il

40

util.format fa questo.

Farà parte di v0.5.3 e può essere utilizzato in questo modo:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');

3
Bello, grazie per il suggerimento! Anche console.log ('% s', value) dovrebbe funzionare.
Azat,

14

Fai quello:

s = 'hello ' + my_name + ', how are you doing'

Aggiornare

Con ES6, puoi anche fare questo:

s = `hello ${my_name}, how are you doing`

Cosa intendi con "Non è possibile"? :? Se ti piace avere un testo formattato, puoi farlo come descritto sopra da Felix Kling. Questa è la risposta migliore come vedo qui;) :)
Merianos Nikos,

@TIMEX È possibile provarlo.
dev_khan,

5

Alcuni modi per estendere String.prototypeo utilizzare i letterali modello ES2015 .

var result = document.querySelector('#result');
// -----------------------------------------------------------------------------------
// Classic
String.prototype.format = String.prototype.format ||
  function () {
    var args = Array.prototype.slice.call(arguments);
    var replacer = function (a){return args[a.substr(1)-1];};
    return this.replace(/(\$\d+)/gm, replacer)
};
result.textContent = 
  'hello $1, $2'.format('[world]', '[how are you?]');

// ES2015#1
'use strict'
String.prototype.format2 = String.prototype.format2 ||
  function(...merge) { return this.replace(/\$\d+/g, r => merge[r.slice(1)-1]); };
result.textContent += '\nHi there $1, $2'.format2('[sir]', '[I\'m fine, thnx]');

// ES2015#2: template literal
var merge = ['[good]', '[know]'];
result.textContent += `\nOk, ${merge[0]} to ${merge[1]}`;
<pre id="result"></pre>



3

Se si utilizza node.js, console.log () accetta la stringa di formato come primo parametro:

 console.log('count: %d', count);

Questo è un buon punto, ma la domanda riguarda l'interpolazione delle stringhe. console.log()genera solo la stringa formattata in STDOUT. In altre parole, non puoi usare il risultato dicount: %d
Jim Schubert,

3

const format = (...args) => args.shift().replace(/%([jsd])/g, x => x === '%j' ? JSON.stringify(args.shift()) : args.shift())

const name = 'Csaba'
const formatted = format('Hi %s, today is %s and your data is %j', name, Date(), {data: {country: 'Hungary', city: 'Budapest'}})

console.log(formatted)


3

Ho scritto una funzione che risolve esattamente il problema.

Il primo argomento è la stringa che voleva essere parametrizzata. Dovresti inserire le tue variabili in questa stringa come questo formato "% s1,% s2, ...% s12" .

Altri argomenti sono i parametri rispettivamente per quella stringa.

/***
 * @example parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
 * @return "my name is John and surname is Doe"
 *
 * @firstArgument {String} like "my name is %s1 and surname is %s2"
 * @otherArguments {String | Number}
 * @returns {String}
 */
const parameterizedString = (...args) => {
  const str = args[0];
  const params = args.filter((arg, index) => index !== 0);
  if (!str) return "";
  return str.replace(/%s[0-9]+/g, matchedStr => {
    const variableIndex = matchedStr.replace("%s", "") - 1;
    return params[variableIndex];
  });
}

Esempi

parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
// returns "my name is John and surname is Doe"

parameterizedString("this%s1 %s2 %s3", " method", "sooo", "goood");
// returns "this method sooo goood"

Se la posizione variabile cambia in quella stringa, anche questa funzione la supporta senza modificare i parametri della funzione.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."

2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';

Vedo un paio di problemi con quello; usa la concatenazione piuttosto che la formattazione delle stringhe che è una bandiera rossa per me quando faccio le revisioni del codice, poiché di solito è più difficile da leggere e mantenere. Inoltre, non è possibile archiviare in modo sicuro quel "modello" in un sistema di recupero (come un file di configurazione o un DB) e inserire successivamente il valore dell'utente.
Rory Browne,

1

Ecco un esempio letterale di stringa multilinea in Node.js.

> let name = 'Fred'
> tm = `Dear ${name},
... This is to inform you, ${name}, that you are
... IN VIOLATION of Penal Code 64.302-4.
... Surrender yourself IMMEDIATELY!
... THIS MEANS YOU, ${name}!!!
...
... `
'Dear Fred,\nThis is to inform you, Fred, that you are\nIN VIOLATION of Penal Code 64.302-4.\nSurrender yourself IMMEDIATELY!\nTHIS MEANS YOU, Fred!!!\n\n'
console.log(tm)
Dear Fred,
This is to inform you, Fred, that you are
IN VIOLATION of Penal Code 64.302-4.
Surrender yourself IMMEDIATELY!
THIS MEANS YOU, Fred!!!


undefined
>

Si chiama stringa di modello e potresti voler solo votare questa risposta esistente
Bergi,

Questo esempio di "stringa di modello" che ho mostrato è una "stringa di modello" che utilizza un valore letterale di stringa multilinea.
Amore e pace - Joe Codeswell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.