Wie füge ich Variablen in Javascript-Zeichenfolgen ein? (Node.js)

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

So machst du es in Python. Wie können Sie das in javascript / node.js tun?

TIMEX
quelle
1
Ich bin sicher, es gab irgendwo einen nächsten Strohmannvar s = 'hello ${my_name}, how are you doing';
Raynos
1
Ich benutze wie Raynos sagte: const Gedicht = "Der schwarze Fluss"; const author = "Joseph Troll"; const favePoem = `Mein Lieblingsgedicht ist $ {Gedicht} von $ {Autor} \.`; Oder Sie können verwenden: console.log ('% s ist% d.', 'Elf', 11);
Gilberto B. Terra Jr.

Antworten:

55

Wenn Sie etwas Ähnliches haben möchten, können Sie eine Funktion erstellen:

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

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

Verwendung:

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

Dies ist nur ein einfaches Beispiel und berücksichtigt nicht verschiedene Arten von Datentypen (wie %iusw.) oder das Entkommen von %s. Aber ich hoffe, es gibt Ihnen eine Idee. Ich bin mir ziemlich sicher, dass es auch Bibliotheken gibt, die eine solche Funktion bieten.

Felix Kling
quelle
1
Das ist im Grunde das Beste, was Sie bekommen, da es nicht direkt von der Sprache unterstützt wird, wie es in Python ist.
Jim Schubert
Die andere Antwort, die util.format () enthält, sollte die akzeptierte Antwort sein ... obwohl vorzugsweise auch die Vorlagenzeichenfolgen von ES6 erwähnt werden (die 2011 zugegebenermaßen nicht existierten). Wir sollten wirklich in der Lage sein, alte Fragen im Wiki zu entführen, um sie auf dem neuesten Stand zu halten. : \
Kyle Baker
1
@FelixKling, da Sie die akzeptierte Antwort sind, können Sie einfach Ihre eigene Antwort aktualisieren, um auf die anderen korrekten Verwendungen hinzuweisen?
Kyle Baker
1
Das ist schön, die Vorlagenliterale sind nicht genau dasselbe
thevangelist
Ich hatte ein Problem bei der Verwendung von "Argumenten". Wenn mehrere Clients von der Analyse übergeben wurden, wurde das "str" ​​verwechselt. Irgendeine Erklärung?
Tspentzas
404

Mit Node.js v4können Sie die Vorlagenzeichenfolgen von ES6 verwenden

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

Sie müssen den String ` stattdessen in den Backtick einschließen'

Sridhar
quelle
1
Plus 1 Weil wir im Jahr 2017 sind und ES6 in der Knotenwelt grundsätzlich Standard ist.
Jankapunkt
1
Dies ist jetzt (2017) die richtige Antwort. Beachten Sie, dass Sie Babel in Ihrer Toolchain benötigen, um ältere Browser zu unterstützen.
Superluminary
3
Ich habe den Entwicklern von node.js vorgeschlagen, dass es wirklich nützlich wäre, auf Seiten wie nodejs.org/api/readline.html klar zu machen, dass es sich um einen Backtick handelt. Hier gab es ein Problem: github.com/nodejs/docs/issues/55
Gail Foad
Fiel für die Backticks Falle mich, danke für den Kommentar;)
Overdrivr
3
Was ist, wenn meine Zeichenfolge Teil der Konfigurationsdatei ist hello ${my_name}, how are you doingund ich nach dem Lesen der Zeichenfolge aus der Konfiguration eine Variable dynamisch zuweisen möchte?
Amreesh Tyagi
43

Ab node.js >4.0sofort wird es kompatibler mit dem ES6-Standard, bei dem die String-Manipulation erheblich verbessert wurde.

Die Antwort auf die ursprüngliche Frage kann so einfach sein wie:

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

Wenn die Zeichenfolge mehrere Zeilen umfassen kann, sind Vorlagen oder HTML / XML-Prozesse recht einfach. Weitere Details und mehr Möglichkeiten dazu: Vorlagenliterale sind Stringliterale bei mozilla.org.

Andrew_1510
quelle
3
"Tilt" anstelle von einfachen Anführungszeichen "Sie sparen Mai Tag :)
Mario Binder
40

util.format macht das.

Es wird Teil von v0.5.3 sein und kann folgendermaßen verwendet werden:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');
Jim Schubert
quelle
3
Schön, danke für den Tipp! console.log ('% s', Wert) sollte ebenfalls funktionieren.
Azat
14

TU das:

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

Aktualisieren

Mit ES6 können Sie auch Folgendes tun:

s = `hello ${my_name}, how are you doing`
Merianos Nikos
quelle
Was meinst du mit "Es ist nicht möglich"? :? Wenn Sie gerne Text formatiert haben, können Sie dies wie oben von Felix Kling beschrieben tun. Dies ist die beste Antwort, wie ich hier sehe;) :)
Merianos Nikos
@TIMEX Es ist möglich, es einfach zu versuchen.
dev_khan
5

Einige Möglichkeiten zum Erweitern String.prototypeoder Verwenden von ES2015- Vorlagenliteralen .

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
quelle
3

Wenn Sie node.js verwenden, verwendet console.log () die Formatzeichenfolge als ersten Parameter:

 console.log('count: %d', count);
Andrey Sidorov
quelle
Dies ist ein guter Punkt, aber die Frage betrifft die String-Interpolation. console.log()gibt nur die formatierte Zeichenfolge an aus STDOUT. Mit anderen Worten, Sie können das Ergebnis voncount: %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
quelle
3

Ich habe eine Funktion geschrieben, die das Problem genau löst.

Das erste Argument ist die Zeichenfolge, die parametrisiert werden wollte. Sie sollten Ihre Variablen in diese Zeichenfolge wie das folgende Format "% s1,% s2, ...% s12" einfügen .

Andere Argumente sind jeweils die Parameter für diese Zeichenfolge.

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

Beispiele

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"

Wenn sich die variable Position in dieser Zeichenfolge ändert, wird sie auch von dieser Funktion unterstützt, ohne die Funktionsparameter zu ändern.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."
fatihturgut
quelle
2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
Termi
quelle
Ich sehe ein paar Probleme damit; Es wird eher Verkettung als Zeichenfolgenformatierung verwendet, was für mich eine rote Fahne ist, wenn ich Codeüberprüfungen durchführe, da es normalerweise schwieriger zu lesen und zu warten ist. Außerdem können Sie dieses "Muster" nicht sicher in einem Abrufsystem (wie einer Konfigurationsdatei oder einer Datenbank) speichern und später den Wert des Benutzers eingeben.
Rory Browne
1

Hier ist ein mehrzeiliges String-Literal- Beispiel 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
>
Liebe und Frieden - Joe Codeswell
quelle
Es wird als Vorlagenzeichenfolge bezeichnet , und Sie können diese vorhandene Antwort
Bergi
Dieses Beispiel für eine "Vorlagenzeichenfolge", das ich gezeigt habe, ist eine "Vorlagenzeichenfolge", die ein mehrzeiliges Zeichenfolgenliteral verwendet.
Liebe und Frieden - Joe Codeswell