web-dev-qa-db-fra.com

Comment insérer des variables dans des chaînes javascript? (Node.js)

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?

90
TIMEX

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 différents types de types de données (tels que %i, etc.) ou l'échappement de %s. Mais j'espère que cela vous donne une idée. Je suis presque sûr qu'il y a aussi des bibliothèques qui offrent une fonction comme celle-ci.

38
Felix Kling

Avec Node.js v4, vous pouvez utiliser les chaînes de modèle 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

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

278
Sridhar

util.format fait ceci. 

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

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

À partir de node.js>4.0, il devient plus compatible avec le standard ES6, où la manipulation des chaînes 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 '

Lorsque la chaîne peut étendre plusieurs lignes, les modèles ou les processus HTML/XML sont très faciles à utiliser. Plus de détails et plus de fonctionnalités à ce sujet: Les littéraux de modèle sont des littéraux de chaîne à mozilla.org.

33
Andrew_1510

si vous utilisez ES6, vous devez utiliser les littéraux de modèle.

//you can do this
let sentence = `My name is ${ user.name }. Nice to meet you.`

lire plus ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

16
Terrence

Faire ça

s = 'hello ' + my_name + ', how are you doing'
11
Merianos Nikos

Quelques façons d'étendre String.prototype ou d'utiliser ES2015 template littals .

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>

4
KooiInc

Essayez sprintf dans JS ou vous pouvez utiliser ceci Gist

4
spicavigo

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
cstuncsik

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

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

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

Le premier argument est la chaîne à paramétrer. Vous devez placer vos variables dans cette chaîne comme ceci: "% s1,% s2, ...% s12" .

Les autres arguments sont les paramètres respectifs 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."
1
fatihturgut
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
1
Termi

Voici un exemple Multi-line String Literal 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
>