Comment mettre des variables dans des chaînes javascript? (Node.js)

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

C'est comme ça que vous le faites en python. Comment pouvez-vous faire cela dans javascript / node.js?

TIMEX
la source
1
Je suis sûr qu'il y avait un homme de paille es-next quelque part à fairevar s = 'hello ${my_name}, how are you doing';
Raynos
1
J'utilise comme Raynos l'a dit: const poem = "The black river"; auteur de const = "Joseph Troll"; const favePoem = `Mon poème préféré est $ {poem} de $ {author} \.`; Ou vous pouvez utiliser: console.log («% s est% d.», «Onze», 11);
Gilberto B.Terra Jr.29

Réponses:

56

Si vous voulez avoir quelque chose de similaire, vous pouvez créer une fonction:

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

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

Usage:

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

Ceci n'est qu'un exemple simple et ne prend pas en compte les différents types de types de données (comme %i, etc.) ou les échappements de %s. Mais j'espère que cela vous donne une idée. Je suis presque sûr qu'il existe également des bibliothèques qui fournissent une fonction comme celle-ci.

Félix Kling
la source
1
C'est fondamentalement le meilleur que vous obtiendrez car il n'est pas pris en charge directement par le langage comme c'est le cas en python.
Jim Schubert
L'autre réponse, qui comporte util.format (), devrait être la réponse acceptée ... même si de préférence, elle mentionnerait également les chaînes de modèle d'ES6 (qui n'existaient certes pas en 2011). Nous devrions vraiment être capables de pirater les anciennes questions pour les maintenir à jour. : \
Kyle Baker
1
@FelixKling, puisque vous êtes la réponse acceptée, pourriez-vous simplement mettre à jour votre propre réponse pour indiquer les autres utilisations correctes?
Kyle Baker
1
C'est bien, les modèles littéraux ne sont pas exactement la même chose
thevangelist
J'ai eu un problème lors de l'utilisation des "arguments". Lorsque plusieurs clients sont passés de l'analyse, le "str" ​​était mélangé. Une explication?
tspentzas
406

Avec Node.js v4, vous pouvez utiliser les chaînes de modèle d'ES6

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

Vous devez envelopper la chaîne dans le backtick ` au lieu de'

Sridhar
la source
1
Plus 1 Parce que nous sommes en 2017 et ES6 est fondamentalement standard dans le monde des nœuds.
Jankapunkt
1
C'est maintenant (2017) la bonne réponse. Sachez que vous aurez besoin de Babel dans votre chaîne d'outils pour prendre en charge les anciens navigateurs.
superluminaire
3
J'ai suggéré aux développeurs de node.js qu'il serait vraiment utile d'indiquer clairement sur des pages telles que nodejs.org/api/readline.html qu'il s'agit d'un backtick. Il y avait un problème ici: github.com/nodejs/docs/issues/55
Gail Foad
Je suis tombé pour le piège des backticks, merci pour le commentaire;)
Overdrivr
3
Que faire si ma chaîne fait partie du fichier de configuration hello ${my_name}, how are you doinget que je souhaite attribuer une variable dynamiquement après avoir lu la chaîne depuis la configuration?
Amreesh Tyagi
43

À partir de là, node.js >4.0il devient plus compatible avec la norme ES6, où la manipulation des chaînes s'est grandement améliorée.

La réponse à la question initiale peut être aussi simple que:

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

Là où la chaîne peut s'étendre sur plusieurs lignes, elle facilite considérablement les modèles ou les processus HTML / XML. Plus de détails et plus de capacités à ce sujet: Les littéraux de modèle sont des littéraux de chaîne sur mozilla.org.

Andrew_1510
la source
3
"Tilt` au lieu de guillemets simples "" vous sauvez le jour de mai :)
Mario Binder
40

util.format fait cela.

Il fera partie de la v0.5.3 et peut être utilisé comme ceci:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');
Jim Schubert
la source
3
Bien, merci pour la pointe! console.log ('% s', valeur) devrait également fonctionner.
Azat
14

Faites ça:

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

Mettre à jour

Avec ES6, vous pouvez également faire ceci:

s = `hello ${my_name}, how are you doing`
Merianos Nikos
la source
Que voulez-vous dire "Ce n'est pas possible"? :? Si vous aimez avoir du texte formaté, vous pouvez le faire comme décrit ci-dessus par Felix Kling. C'est la meilleure réponse que je vois ici;) :)
Merianos Nikos
@TIMEX Il est possible d'essayer.
dev_khan
5

Quelques façons d'étendre String.prototypeou d'utiliser des littéraux de modèle 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
la source
3

Si vous utilisez node.js, console.log () prend la chaîne de format comme premier paramètre:

 console.log('count: %d', count);
Andrey Sidorov
la source
C'est un bon point, mais la question concerne l'interpolation de chaînes. console.log()renvoie uniquement la chaîne formatée vers STDOUT. En d'autres termes, vous ne pouvez pas utiliser le résultat 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
la source
3

J'ai écrit une fonction qui résout le problème avec précision.

Le premier argument est la chaîne qui voulait être paramétrée. Vous devriez mettre vos variables dans cette chaîne comme ce format "% s1,% s2, ...% s12" .

Les autres arguments sont respectivement les paramètres de cette chaîne.

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

Exemples

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 position de la variable change dans cette chaîne, cette fonction la prend également en charge sans modifier les paramètres de la fonction.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."
fatihturgut
la source
2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
Termi
la source
Je vois quelques problèmes avec cela; il utilise la concaténation plutôt que le formatage de chaîne, ce qui est un drapeau rouge pour moi lorsque je fais des révisions de code, car il est généralement plus difficile à lire et à maintenir. De plus, vous ne pouvez pas stocker en toute sécurité ce "modèle" dans un système de récupération (comme un fichier de configuration ou une base de données) et injecter la valeur de l'utilisateur ultérieurement.
Rory Browne le
1

Voici un exemple de littéral de chaîne multiligne dans 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
>
Amour et paix - Joe Codeswell
la source
Cela s'appelle une chaîne de modèle , et vous voudrez peut-être simplement voter pour cette réponse existante
Bergi
Cet exemple de "chaîne de modèle" que j'ai montré EST une "chaîne de modèle" qui utilise un littéral de chaîne multiligne.
Amour et paix - Joe Codeswell