Javascript dizelerine değişkenleri nasıl koyabilirim? (Node.js)


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

Python'da böyle yaparsınız. Javascript / node.js'de bunu nasıl yapabilirsiniz?


1
Eminim yapmak için bir yerde bir es-next strawman vardıvar s = 'hello ${my_name}, how are you doing';
Raynos

1
Raynos'un dediği gibi kullanıyorum: const poem = "Kara nehir"; const author = "Joseph Troll"; const favePoem = `En sevdiğim şiir $ {author} \ tarafından $ {poem}; Veya şunu kullanabilirsiniz: console.log ('% s% d.', 'Onbir', 11);
Gilberto B. Terra Jr.

Yanıtlar:


56

Benzer bir şeye sahip olmak istiyorsanız, bir işlev oluşturabilirsiniz:

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

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

Kullanımı:

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

Bu sadece basit bir örnektir ve farklı veri türlerini ( %ivb.) Veya kaçmasını dikkate almaz %s. Ama umarım sana bir fikir verir. Eminim ki böyle bir işlev sağlayan kütüphaneler de vardır.


1
Temelde bu, python'da olduğu gibi doğrudan dil tarafından desteklenmediği için alacağınız en iyisidir.
Jim Schubert

Util.format () özelliğine sahip diğer cevap, kabul edilen cevap olmalıdır ... yine de ES6'nın şablon dizelerinden (kuşkusuz 2011'de mevcut değildi) bahsedecektir. Eski soruları güncel tutmak için gerçekten wiki-ele geçirebilmeliyiz. : \
Kyle Baker

1
@FelixKling, kabul edilen cevap olduğunuzdan, diğer doğru kullanımlara dikkat çekmek için kendi yanıtınızı güncelleyebilir misiniz?
Kyle Baker

1
Bu güzel, şablon değişmezleri tam olarak aynı şey değil
thevangelist

"Argüman" kullanırken bir sorun yaşadım. Ayrıştırma işleminden birden çok istemci geçtiğinde, "str" ​​karıştırıldı. Herhangi bir açıklama var mı?
tspentzas

406

Node.js ile v4ES6'nın Şablon dizelerini kullanabilirsiniz

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

Dizeyi ` yerine ters tırnak içine sarmanız gerekir'


1
Artı 1 Çünkü 2017'deyiz ve ES6 düğüm dünyasında temel olarak standart.
Jankapunkt

1
Bu şimdi (2017) doğru cevap. Eski tarayıcıları desteklemek için araç zincirinizde Babel'e ihtiyacınız olacağını unutmayın.
superluminary

3
Node.js geliştiricilerine, bunun bir backtick olduğunu nodejs.org/api/readline.html gibi sayfalarda netleştirmenin gerçekten yararlı olacağını önerdim . Burada bir sorun vardı: github.com/nodejs/docs/issues/55
Gail Foad

Backticks kendim tuzak için düştü, yorum için teşekkürler;)
Overdrivr

3
Dizem yapılandırma dosyasının bir parçasıysa ve yapılandırma hello ${my_name}, how are you doingdizesinden okuduktan sonra değişken olarak dinamik olarak atamak istersem ne olur?
Amreesh Tyagi


43

İtibariyle node.js >4.0bu dize manipülasyon ölçüde geliştirilmiş ES6 standardı ile daha uyumlu olur.

Cevap asıl soruya kadar basit olarak şunlar olabilir:

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

Dizenin birden çok satıra yayılabileceği yerlerde, şablonları veya HTML / XML işlemlerini oldukça kolaylaştırır. Bu konuda daha fazla ayrıntı ve daha fazla kapasite: Şablon değişmez değerleri mozilla.org adresindeki dize değişmez değerleridir .


3
Mayıs günü kaydedebilirsiniz "tek teklif yerine" eğin :)
Mario Binder

40

util.format bunu yapar.

V0.5.3'ün bir parçası olacak ve şu şekilde kullanılabilir:

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

3
Güzel, bahşiş için teşekkürler! console.log ('% s', değer) de çalışmalıdır.
Azat

14

Yap bunu:

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

Güncelleme

ES6 ile şunları da yapabilirsiniz:

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

Ne demek "mümkün değil"? :? Metni biçimlendirmek isterseniz, bunu yukarıda Felix Kling tarafından açıklandığı gibi yapabilirsiniz. Burada gördüğüm en iyi cevap bu;) :)
Merianos Nikos

@TIMEX Sadece denemek mümkündür.
dev_khan

5

String.prototypeES2015 şablon değişmezlerini genişletmenin veya kullanmanın birkaç yolu .

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

Node.js kullanıyorsanız, console.log () biçim dizesini ilk parametre olarak alır:

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

Bu iyi bir nokta, ama soru dize enterpolasyonu ile ilgili. console.log()yalnızca biçimlendirilmiş dizeyi çıktı olarak verir STDOUT. Başka bir deyişle, sonucu kullanamazsınızcount: %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

Sorunu tam olarak çözen bir fonksiyon yazdım .

İlk argüman parametrelendirilmek istenen dizgedir. Değişkenlerinizi bu dizeye "% s1,% s2, ...% s12" biçiminde koymalısınız .

Diğer argümanlar , o dizenin sırasıyla parametreleridir.

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

Örnekler

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"

Bu dizede değişken konum değişirse, bu işlev işlev parametrelerini değiştirmeden bunu da destekler.

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

Bununla ilgili birkaç sorun görüyorum; kod incelemeleri yaparken benim için kırmızı bir bayrak olan dize biçimlendirme yerine birleştirme kullanır, çünkü genellikle okunması ve bakımı daha zordur. Ayrıca bu "kalıbı" bir geri alma sisteminde (bir yapılandırma dosyası veya DB gibi) güvenle saklayamaz ve daha sonra kullanıcının değerini giremezsiniz.
Rory Browne

1

İşte Node.js'de Çok Satırlı Bir Dize Değişmez örneği.

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

Buna şablon dizesi denir ve bu mevcut cevabı
Bergi

İ gösterdiğim bu "şablon dize" örneği IS bir Çok satırlı Dize Değişmez kullanan bir "şablon dize" dir.
Sevgi ve barış - Joe Codeswell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.