¿Cómo pongo variables dentro de las cadenas de JavaScript? (Node.js)

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

Así es como lo haces en python. ¿Cómo puedes hacer eso en javascript / node.js?

TIMEX
fuente
1
Estoy seguro de que había un próximo hombre de paja en algún lugar para hacervar s = 'hello ${my_name}, how are you doing';
Raynos
1
Yo uso como Raynos dijo: const poema = "El río negro"; const author = "Joseph Troll"; const favePoem = `Mi poema favorito es $ {poem} por $ {author} \.`; O puede usar: console.log ('% s es% d.', 'Eleven', 11);
Gilberto B. Terra Jr.

Respuestas:

56

Si quieres tener algo similar, puedes crear una función:

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);

Este es solo un ejemplo simple y no tiene en cuenta diferentes tipos de tipos de datos (como %i, etc.) o el escape de %s. Pero espero que te dé alguna idea. Estoy bastante seguro de que también hay bibliotecas que ofrecen una función como esta.

Felix Kling
fuente
1
Eso es básicamente lo mejor que obtendrás, ya que no es compatible directamente con el lenguaje, ya que está en Python.
Jim Schubert
La otra respuesta, que presenta util.format (), debería ser la respuesta aceptada ... aunque preferiblemente también mencionaría las cadenas de plantilla de ES6 (que ciertamente no existía en 2011). Realmente deberíamos poder secuestrar wiki viejas preguntas para mantenerlas actualizadas. : \
Kyle Baker
1
@FelixKling, dado que usted es la respuesta aceptada, ¿podría actualizar su propia respuesta para señalar los otros usos correctos?
Kyle Baker
1
Esto es bueno, los literales de plantilla no son exactamente lo mismo
thevangelist
Tuve un problema al usar "argumentos". Cuando varios clientes pasaron del análisis, el "str" ​​se mezcló. Alguna explicación?
tspentzas
405

Con Node.js v4, puede usar las cadenas de plantilla de ES6

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

Necesita envolver la cadena dentro del backtick en ` lugar de'

Sridhar
fuente
1
Plus 1 Porque estamos en 2017 y ES6 es básicamente estándar en el mundo de nodos.
Jankapunkt
1
Esta es ahora (2017) la respuesta correcta. Tenga en cuenta que necesitará Babel en su cadena de herramientas para admitir navegadores más antiguos.
superluminary
3
Les he sugerido a los desarrolladores de node.js que sería realmente útil aclarar en páginas como nodejs.org/api/readline.html que es un backtick. Había un problema aquí: github.com/nodejs/docs/issues/55
Gail Foad
Cayé por la trampa de los backticks, gracias por el comentario;)
Overdrivr
3
¿Qué sucede si mi cadena es parte del archivo de configuración hello ${my_name}, how are you doingy quiero asignar variables dinámicamente después de leer la cadena desde la configuración?
Amreesh Tyagi
43

A medida que node.js >4.0se vuelve más compatible con el estándar ES6, donde la manipulación de cadenas mejoró considerablemente.

La respuesta a la pregunta original puede ser tan simple como:

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

Cuando la cadena puede extender varias líneas, hace que las plantillas o los procesos HTML / XML sean bastante fáciles. Más detalles y más capacidad al respecto: los literales de plantilla son literales de cadena en mozilla.org.

Andrew_1510
fuente
3
"tilt` en lugar de comillas simples "" guarda el día de mayo :)
Mario Binder
40

util.format hace esto.

Será parte de v0.5.3 y se puede usar así:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');
Jim Schubert
fuente
3
Bien, gracias por el consejo! console.log ('% s', valor) también debería funcionar.
Azat
14

Haz eso:

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

Actualizar

Con ES6, también podría hacer esto:

s = `hello ${my_name}, how are you doing`
Merianos Nikos
fuente
¿Qué quieres decir con "No es posible"? :? Si desea tener texto formateado, puede hacerlo como se describe anteriormente por Felix Kling. Esta es la mejor respuesta como veo aquí;) :)
Merianos Nikos
@TIMEX Es posible solo pruébalo.
dev_khan
5

Algunas formas de extender String.prototypeo usar los literales de plantilla 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>

KooiInc
fuente
3

Si está utilizando node.js, console.log () toma la cadena de formato como primer parámetro:

 console.log('count: %d', count);
Andrey Sidorov
fuente
Este es un buen punto, pero la pregunta es sobre la interpolación de cadenas. console.log()solo envía la cadena formateada a STDOUT. En otras palabras, no puede usar el resultado decount: %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)

cstuncsik
fuente
3

Escribí una función que resuelve el problema con precisión.

El primer argumento es la cadena que quería ser parametrizada. Debe colocar sus variables en esta cadena como este formato "% s1,% s2, ...% s12" .

Otros argumentos son los parámetros respectivamente para esa cadena.

/***
 * @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];
  });
}

Ejemplos

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"

Si la posición variable cambia en esa cadena, esta función también la admite sin cambiar los parámetros de la función.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."
fatihturgut
fuente
2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
Termi
fuente
Veo un par de problemas con eso; utiliza la concatenación en lugar del formato de cadena, lo cual es una señal de alerta para mí cuando hago revisiones de código, ya que generalmente es más difícil de leer y mantener. Además, no puede almacenar con seguridad ese "patrón" en un sistema de recuperación (como un archivo de configuración o DB) e inyectar el valor del usuario más tarde.
Rory Browne
1

Aquí hay un ejemplo literal de cadenas de varias líneas en 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
>
Amor y paz - Joe Codeswell
fuente
Se llama una cadena de plantilla , y es posible que desee votar esta respuesta existente
Bergi
Este ejemplo de "cadena de plantilla" que he mostrado ES una "cadena de plantilla" que usa un literal de cadena de varias líneas.
Amor y paz - Joe Codeswell