ฉันจะวางตัวแปรภายในสตริง javascript ได้อย่างไร (Node.js)


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

นั่นเป็นวิธีที่คุณทำในหลาม คุณจะทำเช่นนั้นใน javascript / node.js ได้อย่างไร


1
ฉันแน่ใจว่ามีคนทำvar s = 'hello ${my_name}, how are you doing';
หมวก

1
ฉันใช้เป็น Raynos กล่าวว่า: บทกวี const = "แม่น้ำดำ"; const author = "Joseph Troll"; const favePoem = `บทกวีที่ฉันชอบคือ $ {poem} โดย $ {author} \.`; หรือคุณสามารถใช้: console.log ('% s คือ% d.', 'Eleven', 11);
Gilberto B. Terra Jr.

คำตอบ:


56

หากคุณต้องการมีสิ่งที่คล้ายกันคุณสามารถสร้างฟังก์ชั่น:

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

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

การใช้งาน:

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

นี้เป็นเพียงตัวอย่างง่ายๆและไม่คำนึงถึงความแตกต่างกันของชนิดข้อมูล (เช่น%iฯลฯ ) %sหรือการหลบหนีของ แต่ฉันหวังว่ามันจะทำให้คุณมีความคิด ฉันค่อนข้างแน่ใจว่ามีห้องสมุดอยู่ข้างนอกซึ่งมีฟังก์ชั่นเช่นนี้


1
นั่นเป็นสิ่งที่ดีที่สุดที่คุณจะได้รับเนื่องจากไม่รองรับภาษาโดยตรงเนื่องจากเป็นภาษาไพ ธ อน
Jim Schubert

คำตอบอื่น ๆ ที่มีคุณสมบัติ util.format () ควรเป็นคำตอบที่ได้รับการยอมรับ ... โดยเฉพาะอย่างยิ่งมันจะกล่าวถึงสตริงเทมเพลตของ ES6 (ซึ่งไม่ได้รับการยอมรับในปี 2011) เราควรจะสามารถตอบคำถามเก่า ๆ ของ wiki-hijack เพื่อให้พวกเขาได้รับการปรับปรุง : \
Kyle Baker

1
@FelixKling เนื่องจากคุณเป็นคำตอบที่ได้รับการยอมรับคุณสามารถอัปเดตคำตอบของคุณเองเพื่อชี้ให้เห็นวิธีการใช้ที่ถูกต้องอื่น ๆ ได้หรือไม่?
Kyle Baker

1
นี่เป็นสิ่งที่ดีเทมเพลตตัวอักษรนั้นไม่เหมือนกันทุกอย่าง
ประกาศข่าว

ฉันมีปัญหาขณะใช้ "อาร์กิวเมนต์" เมื่อไคลเอนต์จำนวนมากส่งผ่านจากการแยกวิเคราะห์ "str" ​​ถูกผสมกัน คำอธิบายใด ๆ
tspentzas

406

ด้วย Node.js v4คุณสามารถใช้สตริงเทมเพลตของ ES6

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

คุณต้องตัดสตริงภายใน backtick ` แทน'


1
บวก 1 เนื่องจากเราอยู่ในปี 2560 และ ES6 นั้นเป็นมาตรฐานในโลกโหนด
Jankapunkt

1
นี่คือตอนนี้ (2017) คำตอบที่ถูกต้อง โปรดระวังว่าคุณจะต้องใช้ Babel ใน toolchain ของคุณเพื่อรองรับเบราว์เซอร์รุ่นเก่า
superluminary

3
ฉันแนะนำให้นักพัฒนา node.js เห็นว่ามันจะมีประโยชน์จริง ๆ ที่จะทำให้มันชัดเจนบนหน้าเว็บเช่นnodejs.org/api/readline.htmlว่าเป็น backtick มีปัญหาเกิดขึ้นที่นี่: github.com/nodejs/docs/issues/55
Gail Foad

ลดลงเป็น backticks กับดักตัวเองขอบคุณสำหรับความคิดเห็น;)
Overdrivr

3
จะเกิดอะไรขึ้นถ้าสตริงของฉันเป็นส่วนหนึ่งของไฟล์กำหนดค่าhello ${my_name}, how are you doingและฉันต้องการกำหนดตัวแปรแบบไดนามิกหลังจากอ่านสตริงจาก config
Amreesh Tyagi


43

เนื่องจากnode.js >4.0มันเข้ากันได้กับมาตรฐาน ES6 มากขึ้นซึ่งการจัดการสตริงได้รับการปรับปรุงอย่างมาก

คำตอบไปที่คำถามเดิมสามารถจะเป็นง่ายๆเป็น:

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

ในกรณีที่สตริงสามารถกระจายหลายบรรทัดมันทำให้แม่แบบหรือกระบวนการ HTML / XML ค่อนข้างง่าย รายละเอียดเพิ่มเติมและความสามารถเพิ่มเติมเกี่ยวกับมัน: ตัวอักษรแม่แบบเป็นตัวอักษรสตริงที่ mozilla.org


3
"เอียง" แทนที่จะใส่เครื่องหมายคำพูดเดี่ยว "" คุณสามารถประหยัดได้ทั้งวัน :)
Mario Binder

40

util.formatทำสิ่งนี้

มันจะเป็นส่วนหนึ่งของv0.5.3และสามารถใช้งานได้เช่นนี้:

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

3
เยี่ยมมากขอบคุณสำหรับเคล็ดลับ! console.log ('% s', ค่า) ควรทำงานเช่นกัน
Azat

14

ทำอย่างนั้น:

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

ปรับปรุง

ด้วย ES6 คุณสามารถทำสิ่งนี้ได้:

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

คุณหมายถึง "มันเป็นไปไม่ได้" :? หากคุณต้องการข้อความที่มีการจัดรูปแบบคุณสามารถทำได้ตามที่อธิบายไว้ข้างต้นโดย Felix Kling นี่เป็นคำตอบที่ดีที่สุดที่ฉันเห็นที่นี่;) :)
Merianos Nikos

@TIMEX มันเป็นไปได้แค่ลองดู
dev_khan

5

กี่วิธีที่จะขยายString.prototypeหรือใช้ 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>



3

หากคุณกำลังใช้ node.js, console.log ()รับสตริงรูปแบบเป็นพารามิเตอร์แรก:

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

นี่เป็นจุดที่ดี แต่คำถามเกี่ยวกับการแก้ไขสตริง console.log()เอาต์พุตสตริงที่จัดรูปแบบSTDOUTเท่านั้น คุณไม่สามารถใช้ผลลัพธ์ของcount: %d
จิมชูเบิร์

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

ฉันเขียนฟังก์ชันที่แก้ปัญหาได้อย่างแม่นยำ

อาร์กิวเมนต์แรกคือสตริงที่ต้องการกำหนดพารามิเตอร์ คุณควรใส่ตัวแปรของคุณในสายนี้เช่นรูปแบบนี้"% s1, s2% ... % s12"

อาร์กิวเมนต์อื่นคือพารามิเตอร์ตามลำดับสำหรับสตริงนั้น

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

ตัวอย่าง

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"

หากตำแหน่งตัวแปรเปลี่ยนแปลงในสายนั้นฟังก์ชันนี้ก็รองรับเช่นกันโดยไม่เปลี่ยนพารามิเตอร์ฟังก์ชัน

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

ฉันเห็นปัญหาสองสามข้อกับสิ่งนั้น มันใช้การเรียงต่อกันมากกว่าการจัดรูปแบบสตริงซึ่งเป็นค่าสถานะสีแดงสำหรับฉันเมื่อทำการตรวจสอบโค้ดเนื่องจากมักจะยากต่อการอ่านและบำรุงรักษา นอกจากนี้คุณไม่สามารถจัดเก็บ "รูปแบบ" นั้นไว้ในระบบการเรียกคืนได้ (เช่นไฟล์กำหนดค่าหรือฐานข้อมูล) และเพิ่มค่าของผู้ใช้ในภายหลัง
Rory Browne

1

นี่คือตัวอย่างของตัวอักษรสตริงหลายบรรทัดใน 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
>

มันเรียกว่าแม่แบบสตริงและคุณอาจต้องการ
ถอน

ตัวอย่าง "แม่แบบสตริง" ที่ฉันแสดงให้เห็นว่าเป็น "แม่แบบสตริง" ที่ใช้ตัวอักษรสตริงหลายบรรทัด
ความรักและความสงบสุข - Joe Codeswell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.