ฉันจะแก้ไขการสอดแทรกสตริงใน JavaScript ได้อย่างไร


535

พิจารณารหัสนี้:

var age = 3;

console.log("I'm " + age + " years old!");

มีวิธีอื่นในการแทรกค่าของตัวแปรในสตริงนอกเหนือจากการต่อข้อมูลสตริงหรือไม่?


7
คุณสามารถชำระเงิน CoffeeScript: coffeescript.org
dennismonsewicz

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


2
การต่อข้อมูลไม่ใช่การแก้ไขและผู้ใช้ถามวิธีการแก้ไข ฉันคิดว่าในที่สุดเลฟก็ให้คำตอบนั่นคือไม่มีวิธีทำใน JS พื้นเมือง ฉันไม่เข้าใจว่าทำไมนี่ไม่ใช่คำถามจริง
gitb

4
ถ้าฉันจะได้รับอนุญาตให้คำตอบที่มีในขณะนี้คือการแก้ปัญหาเริ่มต้นสำหรับ interpretters ใหม่ (2015 FF และ Chrome สนับสนุนแล้ว): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... เช่น. Show GRAPH of : ${fundCode}-${funcCode} ได้รับฉันShow GRAPH of : AIP001-_sma (ใช้ backticks รอบสตริง 1 .... ดูเหมือนจะไม่สามารถแสดงที่นี่)
มาร์กอส

คำตอบ:


536

ตั้งแต่ ES6 คุณสามารถใช้เทมเพลตตัวอักษร :

const age = 3
console.log(`I'm ${age} years old!`)

PSหมายเหตุการใช้ backticks ``นี้:


3
ฉันสงสัยว่าทำไมพวกเขาไปกับ backticks เกี่ยวกับเรื่องนี้จะไม่ "$ {age}" เพียงพอที่จะทำการแก้ไขหรือไม่
น้ำมะนาวหัวเราะ

5
@LaughingLemonade ความเข้ากันได้แบบย้อนกลับ หากมีการใช้วิธีการดังกล่าวรหัสที่มีอยู่ทั้งหมดซึ่งพิมพ์สตริงในรูปแบบนั้นจะล้มเหลว
thefourtheye

1
@ Jonathan ฉันไม่ชอบ backticks เป็นตัวละครที่มีความหมายเสมอ แต่ฉันไม่แน่ใจว่าเหตุผลสากลหรือใช้กับรูปแบบแป้นพิมพ์ภาษาของฉันเท่านั้น Backtick เป็นตัวละครพิเศษที่รอการเขียนจนกระทั่งตัวละครตัวถัดไปกำหนดให้กดสองครั้งเพื่อเขียน (และเขียนสองตัวในเวลานี้) นี่เป็นเพราะตัวละครบางตัวโต้ตอบกับพวกเขาเช่น "e" ถ้าฉันพยายามเขียน "ello" กับพวกเขาฉันจะได้èllo`` นอกจากนี้ยังตั้งอยู่ค่อนข้างน่ารำคาญ (shift + forwardtick ซึ่งเป็นอักขระ lookahead พิเศษเช่นนั้น) เนื่องจากต้องการ shift เพื่อพิมพ์ซึ่งแตกต่างจาก '
เฟลิกซ์

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

239

TL; DR

ใช้ตัวอักษรสตริงของเทมเพลต ECMAScript 2015 หากมี

คำอธิบาย

ไม่มีวิธีโดยตรงที่จะทำตามข้อกำหนด ECMAScript 5 แต่ ECMAScript 6 มีสตริงเท็มเพลตซึ่งรู้จักกันในชื่อquasi-literalsระหว่างการร่างข้อมูลจำเพาะ ใช้พวกเขาเช่นนี้

> var n = 42;
undefined
> `foo${n}bar`
'foo42bar'

คุณสามารถใช้การแสดงออก JavaScript ถูกต้องใด ๆ {}ภายใน ตัวอย่างเช่น:

> `foo${{name: 'Google'}.name}bar`
'fooGooglebar'
> `foo${1 + 3}bar`
'foo4bar'

สิ่งสำคัญอีกอย่างคือคุณไม่ต้องกังวลกับสายหลายสายอีกต่อไป คุณสามารถเขียนได้ง่าย ๆ เช่น

> `foo
...     bar`
'foo\n    bar'

หมายเหตุ:ฉันใช้ io.js v2.4.0 เพื่อประเมินสตริงเท็มเพลตทั้งหมดที่แสดงด้านบน คุณยังสามารถใช้ Chrome ล่าสุดเพื่อทดสอบตัวอย่างที่แสดงด้านบน

หมายเหตุ:ข้อมูลจำเพาะ ES6 ได้รับการสรุปแล้ว แต่ยังไม่ได้ใช้กับเบราว์เซอร์หลักทั้งหมด
ตามหน้าเครือข่ายผู้พัฒนา Mozillaนี้จะถูกนำไปใช้สำหรับการสนับสนุนขั้นพื้นฐานเริ่มต้นในเวอร์ชันต่อไปนี้: Firefox 34, Chrome 41, Internet Explorer 12 หากคุณเป็นผู้ใช้ Opera, Safari หรือ Internet Explorer และอยากรู้เกี่ยวกับสิ่งนี้ในตอนนี้ , เตียงทดสอบนี้สามารถนำมาใช้ในการเล่นรอบจนทุกคนได้รับการสนับสนุนสำหรับการนี้


3
มันสามารถใช้งานได้ถ้าคุณใช้babeljsเพื่อให้คุณสามารถนำไปใช้ใน codebase ของคุณและจากนั้นก็ปล่อยขั้นตอนการแพร่กระจายภายหลังเมื่อเบราว์เซอร์ที่คุณต้องการสนับสนุนการใช้มัน
ivarni

มีวิธีการแปลงสตริงมาตรฐานเป็นสตริงตัวอักษรแม่แบบ? ตัวอย่างเช่นหากมีไฟล์ json ที่มีตารางการแปลที่ต้องการค่าที่แทรกเข้าไปในไฟล์เหล่านั้นเพื่อการแสดงผล? ฉันคิดว่าวิธีแก้ปัญหาแรกอาจทำงานได้ดีสำหรับสถานการณ์นี้ แต่ฉันชอบไวยากรณ์ของแม่แบบสตริงใหม่โดยทั่วไป
nbering

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

2
สำหรับสายตาที่ไม่ดีในผู้ชมตัวละคร `นั้นแตกต่างจาก ' หากคุณมีปัญหาในการนี้เพื่อให้แน่ใจว่าการทำงานของคุณโดยใช้คำพูดที่หลุมฝังศพ (aka เอียงอ้างกลับมาอ้าง) en.wikipedia.org/wiki/Grave_accent มันจะอยู่ที่ด้านบนซ้ายบนแป้นพิมพ์ของคุณ :)
ควินซี

@Quincy ด้านล่างซ้ายของแป้นพิมพ์ Mac - รู้จักกันในชื่อ back-tick :)
RB

192

JavaScript Remedialของ Douglas Crockford มีString.prototype.supplantฟังก์ชั่น มันสั้นคุ้นเคยและใช้งานง่าย:

String.prototype.supplant = function (o) {
    return this.replace(/{([^{}]*)}/g,
        function (a, b) {
            var r = o[b];
            return typeof r === 'string' || typeof r === 'number' ? r : a;
        }
    );
};

// Usage:
alert("I'm {age} years old!".supplant({ age: 29 }));
alert("The {a} says {n}, {n}, {n}!".supplant({ a: 'cow', n: 'moo' }));

หากคุณไม่ต้องการเปลี่ยนต้นแบบของสตริงคุณสามารถปรับให้เป็นแบบสแตนด์อโลนหรือวางไว้ในเนมสเปซอื่นหรืออะไรก็ตาม


102
หมายเหตุ: สิ่งนี้จะทำงานช้าลงสิบเท่าเมื่อเทียบกับการต่อข้อมูล
cllpse

36
และต้องใช้การกดแป้นและไบต์อีกประมาณสามครั้ง
ma11hew28

8
@roosteronacid - คุณสามารถให้มุมมองเกี่ยวกับการลดความเร็วที่? เช่นจาก 0.01s ถึง 0.1s (สำคัญ) หรือจาก 0.000000001s ถึง 0.00000001s (ไม่เกี่ยวข้อง)
Chris

16
@george: การทดสอบอย่างรวดเร็วในเครื่องของฉันให้ 7312 ns สำหรับ "วัวพูดว่า moo, moo, moo!" ใช้วิธีของ Crockford กับ 111 ns สำหรับฟังก์ชั่น precompiled ที่ดึงตัวแปรออกมาจากวัตถุที่ผ่านและเชื่อมต่อพวกมันเข้ากับส่วนคงที่ของสตริงแม่แบบ นี่คือ Chrome 21.
George

13
หรือใช้งานได้เช่น:"The {0} says {1}, {1}, {1}!".supplant(['cow', 'moo'])
Robert Massa

54

คำเตือน: หลีกเลี่ยงระบบเทมเพลตใด ๆ ที่ไม่อนุญาตให้คุณหลีกเลี่ยงตัวคั่น ตัวอย่างเช่นจะไม่มีวิธีการแสดงผลต่อไปนี้โดยใช้supplant()วิธีการที่กล่าวถึงที่นี่

"ฉันอายุ 3 ปีต้องขอบคุณตัวแปร {อายุ} ของฉัน"

การแก้ไขอย่างง่ายอาจทำงานกับสคริปต์ที่มีขนาดเล็ก แต่มักจะมาพร้อมกับข้อบกพร่องของการออกแบบที่จะ จำกัด การใช้งานอย่างจริงจัง ฉันชอบเทมเพลต DOM อย่างแท้จริงเช่น:

<div> I am <span id="age"></span> years old!</div>

และใช้การจัดการ jQuery: $('#age').text(3)

อีกทางเลือกหนึ่งถ้าคุณเบื่อกับการต่อสตริงจะมีไวยากรณ์สำรองเสมอ:

var age = 3;
var str = ["I'm only", age, "years old"].join(" ");

4
บันทึก Side: Array.join()จะช้ากว่าโดยตรง ( +รูปแบบ) เรียงต่อกันเนื่องจากเครื่องมือเบราว์เซอร์ (ซึ่งรวมถึง V8 ซึ่งรวมถึงโหนดและเกือบทุกอย่างที่ทำงาน JS วันนี้) มีการเพิ่มประสิทธิภาพมันอย่างหนาแน่นและมีการจัดการที่ดีของความแตกต่างในความโปรดปรานของการเรียงต่อกันโดยตรง
Pilau

1
วิธีการแทนที่จะช่วยให้คุณสร้างสตริงที่คุณพูดถึง: {token} จะถูกแทนที่หากวัตถุข้อมูลมีสมาชิกที่เรียกว่าtoken- ดังนั้นหากคุณไม่ได้ให้วัตถุข้อมูลที่มีageสมาชิกก็จะถูกปรับ
Chris Fewtrell

1
Chris ฉันไม่เห็นวิธีการแก้ปัญหา ฉันสามารถอัปเดตตัวอย่างเพื่อใช้ทั้งตัวแปรอายุและสตริง {อายุ} ได้อย่างง่ายดาย คุณต้องการที่จะกังวลเกี่ยวกับสิ่งที่คุณสามารถตั้งชื่อตัวแปรของคุณตามข้อความคัดลอกแม่แบบ? - นอกจากนี้เนื่องจากโพสต์นี้ฉันได้กลายเป็นแฟนตัวยงของห้องสมุดผูกพันข้อมูล บางอย่างเช่น RactiveJS จะช่วยให้คุณประหยัดจาก DOM ที่เต็มไปด้วยช่วงความแปรปรวน และต่างจากหนวดที่มันอัพเดทเฉพาะส่วนที่หน้า
greg.kindel

3
คำตอบหลักของคุณดูเหมือนว่าสมมติว่าจาวาสคริปต์นี้ทำงานในสภาพแวดล้อมของเบราว์เซอร์แม้ว่าคำถามนั้นจะไม่ติดแท็กด้วย HTML
ศีล

2
"คำเตือน" ของคุณเกี่ยวกับsupplantไม่รับประกัน: "I am 3 years old thanks to my {age} variable.".supplant({}));ส่งคืนสตริงที่กำหนด หากageได้รับก็สามารถพิมพ์{และ}ใช้งานได้{{age}}
le_m

23

ลองใช้sprintf ไลบรารี่ (การใช้ JavaScript sprintf แบบโอเพ่นซอร์สสมบูรณ์) ตัวอย่างเช่น:

vsprintf('The first 4 letters of the english alphabet are: %s, %s, %s and %s', ['a', 'b', 'c', 'd']);

vsprintfใช้อาร์เรย์ของอาร์กิวเมนต์และส่งคืนสตริงที่จัดรูปแบบ


22

ฉันใช้รูปแบบนี้ในหลายภาษาเมื่อฉันยังไม่รู้วิธีที่จะทำอย่างถูกต้องและเพียงต้องการที่จะได้รับความคิดอย่างรวดเร็ว:

// JavaScript
let stringValue = 'Hello, my name is {name}. You {action} my {relation}.'
    .replace(/{name}/g    ,'Indigo Montoya')
    .replace(/{action}/g  ,'killed')
    .replace(/{relation}/g,'father')
    ;

แม้ว่าจะไม่มีประสิทธิภาพโดยเฉพาะฉันพบว่าสามารถอ่านได้ ใช้ได้เสมอและใช้ได้เสมอ:

' VBScript
dim template = "Hello, my name is {name}. You {action} my {relation}."
dim stringvalue = template
stringValue = replace(stringvalue, "{name}"    ,"Luke Skywalker")     
stringValue = replace(stringvalue, "{relation}","Father")     
stringValue = replace(stringvalue, "{action}"  ,"are")

เสมอ

* COBOL
INSPECT stringvalue REPLACING FIRST '{name}'     BY 'Grendel'
INSPECT stringvalue REPLACING FIRST '{relation}' BY 'Mother'
INSPECT stringvalue REPLACING FIRST '{action}'   BY 'did unspeakable things to'

21

คุณสามารถใช้ระบบแม่แบบต้นแบบถ้าคุณรู้สึกอยากใช้ค้อนขนาดใหญ่เพื่อแคร็ก:

var template = new Template("I'm #{age} years old!");
alert(template.evaluate({age: 21}));

การใช้ต้นแบบคุณสามารถเรียกใช้การแก้ไขโดยตรงapi.prototypejs.org/language/String/prototype/interpolate (ภายในจะใช้เทมเพลต)
rvazquezglez


6

ลองกีวีซึ่งเป็นโมดูล JavaScript ที่มีน้ำหนักเบาสำหรับการแก้ไขสตริง

คุณทำได้

Kiwi.compose("I'm % years old!", [age]);

หรือ

Kiwi.compose("I'm %{age} years old!", {"age" : age});

6

ถ้าคุณต้องการที่จะสอดแทรกconsole.logเอาท์พุทแล้วเพียงแค่

console.log("Eruption 1: %s", eruption1);
                         ^^

นี่%sคือสิ่งที่เรียกว่า "ตัวระบุรูปแบบ" console.logมีการแก้ไขการสนับสนุนในตัวเช่นนี้


1
นี่เป็นคำตอบที่ถูกต้องเท่านั้น คำถามเกี่ยวกับการแก้ไขไม่ใช่สตริงแม่แบบ
sospedra

5

นี่คือวิธีแก้ปัญหาที่คุณต้องระบุวัตถุด้วยค่า หากคุณไม่ได้ระบุวัตถุเป็นพารามิเตอร์มันจะเริ่มต้นการใช้ตัวแปรทั่วโลก แต่ควรใช้พารามิเตอร์ดีกว่า

String.prototype.interpolate = function(props) {
    return this.replace(/\{(\w+)\}/g, function(match, expr) {
        return (props || window)[expr];
    });
};

// Test:

// Using the parameter (advised approach)
document.getElementById("resultA").innerText = "Eruption 1: {eruption1}".interpolate({ eruption1: 112 });

// Using the global scope
var eruption2 = 116;
document.getElementById("resultB").innerText = "Eruption 2: {eruption2}".interpolate();
<div id="resultA"></div><div id="resultB"></div>


3
อย่าใช้eval, evalเป็นความชั่วร้าย!
chris97ong

5
@ chris97ong ในขณะที่ "จริง" อย่างน้อยก็ให้เหตุผล ("ความชั่วร้าย" ไม่ได้ช่วย) หรือทางเลือกอื่น มีวิธีใช้เกือบตลอดเวลาevalแต่บางครั้งก็ใช้ไม่ได้ ตัวอย่างเช่นถ้า OP ต้องการวิธีการประมาณค่าโดยใช้ขอบเขตปัจจุบันโดยไม่ต้องผ่านการค้นหาวัตถุ (เช่นวิธีการแก้ไขการทำงานของ Groovy) ฉันค่อนข้างแน่ใจว่าevalจะต้องใช้ อย่าหันไปพึ่ง "Eval is Evil" อันเก่าแก่
เอียน

1
อย่าใช้ eval และไม่เคยแนะนำให้ใช้
hasen

2
@hasenj นี่คือเหตุผลที่ฉันพูดว่า"อาจไม่ใช่ความคิดที่ดีที่สุด"และให้วิธีการอื่น แต่น่าเสียดายที่เป็นวิธีเดียวที่จะเข้าถึงตัวแปรท้องถิ่นอยู่ในขอบเขตeval ดังนั้นอย่าปฏิเสธเพราะมันทำให้คุณรู้สึกเจ็บปวด BTW ฉันชอบทางเลือกมากกว่าเพราะมันปลอดภัยกว่า แต่evalวิธีนี้เป็นสิ่งที่ตอบคำถามของ OP ได้อย่างแม่นยำดังนั้นจึงเป็นคำตอบ
Lucas Trzesniewski

1
ปัญหาที่เกิดขึ้นevalคือไม่สามารถเข้าถึง vars จากขอบเขตอื่นดังนั้นหากการ.interpolateโทรของคุณอยู่ในฟังก์ชั่นอื่นและไม่ใช่ทั่วโลกก็จะไม่ทำงาน
georg

2

เมื่อเพิ่มคำตอบที่สองของ Greg Kindelคุณสามารถเขียนฟังก์ชันเพื่อกำจัดส่วนสำเร็จรูปบางส่วน:

var fmt = {
    join: function() {
        return Array.prototype.slice.call(arguments).join(' ');
    },
    log: function() {
        console.log(this.join(...arguments));
    }
}

การใช้งาน:

var age = 7;
var years = 5;
var sentence = fmt.join('I am now', age, 'years old!');
fmt.log('In', years, 'years I will be', age + years, 'years old!');

1

ฉันสามารถแสดงให้คุณเห็นด้วยตัวอย่าง:

function fullName(first, last) {
  let fullName = first + " " + last;
  return fullName;
}

function fullNameStringInterpolation(first, last) {
  let fullName = `${first} ${last}`;
  return fullName;
}

console.log('Old School: ' + fullName('Carlos', 'Gutierrez'));

console.log('New School: ' + fullNameStringInterpolation('Carlos', 'Gutierrez'));


1

ตั้งแต่ ES6 หากคุณต้องการทำการสอดแทรกสตริงในคีย์วัตถุคุณจะได้รับ a SyntaxError: expected property name, got '${'ถ้าคุณทำสิ่งที่ชอบ:

let age = 3
let obj = { `${age}`: 3 }

คุณควรทำสิ่งต่อไปนี้แทน:

let obj = { [`${age}`]: 3 }

1

เพิ่มเติมสำหรับโพสต์ของ @Chris Nielsen รุ่นES6

String.prototype.supplant = function (o) {
  return this.replace(/\${([^\${}]*)}/g,
    (a, b) => {
      var r = o[b];
      return typeof r === 'string' || typeof r === 'number' ? r : a;
    }
  );
};

string = "How now ${color} cow? {${greeting}}, ${greeting}, moo says the ${color} cow.";

string.supplant({color: "brown", greeting: "moo"});
=> "How now brown cow? {moo}, moo, moo says the brown cow."

0

การใช้แม่แบบไวยากรณ์ล้มเหลวในเบราว์เซอร์รุ่นเก่าสิ่งสำคัญถ้าคุณกำลังสร้าง HTML เพื่อการใช้งานสาธารณะ การใช้การเรียงต่อกันเป็นเรื่องที่น่าเบื่อและอ่านยากโดยเฉพาะอย่างยิ่งถ้าคุณมีการแสดงออกมากหรือยาวหรือถ้าคุณต้องใช้วงเล็บเพื่อจัดการการผสมของจำนวนและรายการสตริง (ทั้งสองอย่างใช้ตัวดำเนินการ +)

PHP ขยายสตริงที่ยกมาที่มีตัวแปรและแม้กระทั่งนิพจน์บางอย่างโดยใช้สัญกรณ์ขนาดกะทัดรัดมาก: $a="the color is $color";

ใน JavaScript ฟังก์ชันที่มีประสิทธิภาพสามารถเขียนได้เพื่อสนับสนุนสิ่งนี้: var a=S('the color is ',color);โดยใช้อาร์กิวเมนต์จำนวนตัวแปร ในขณะที่ไม่มีข้อได้เปรียบเหนือการต่อข้อมูลในตัวอย่างนี้เมื่อนิพจน์ยาวกว่าไวยากรณ์นี้อาจชัดเจนขึ้น หรือสามารถใช้เครื่องหมายดอลลาร์เพื่อส่งสัญญาณการเริ่มต้นของนิพจน์โดยใช้ฟังก์ชัน JavaScript เช่นเดียวกับใน PHP

ในทางกลับกันการเขียนฟังก์ชั่นการแก้ปัญหาที่มีประสิทธิภาพเพื่อให้การขยายตัวเหมือนแม่แบบของสตริงสำหรับเบราว์เซอร์รุ่นเก่าจะไม่ยาก อาจมีคนทำไปแล้ว

ในที่สุดฉันคิดว่า sprintf (เช่นใน C, C ++ และ PHP) สามารถเขียนใน JavaScript แม้ว่ามันจะมีประสิทธิภาพน้อยกว่าโซลูชันอื่น ๆ เหล่านี้เล็กน้อย


0

การแก้ไขความยืดหยุ่นที่กำหนดเอง:

var sourceElm = document.querySelector('input')

// interpolation callback
const onInterpolate = s => `<mark>${s}</mark>`

// listen to "input" event
sourceElm.addEventListener('input', parseInput) 

// parse on window load
parseInput() 

// input element parser
function parseInput(){
  var html = interpolate(sourceElm.value, undefined, onInterpolate)
  sourceElm.nextElementSibling.innerHTML = html;
}

// the actual interpolation 
function interpolate(str, interpolator = ["{{", "}}"], cb){
  // split by "start" pattern
  return str.split(interpolator[0]).map((s1, i) => {
    // first item can be safely ignored
	  if( i == 0 ) return s1;
    // for each splited part, split again by "end" pattern 
    const s2 = s1.split(interpolator[1]);

    // is there's no "closing" match to this part, rebuild it
    if( s1 == s2[0]) return interpolator[0] + s2[0]
    // if this split's result as multiple items' array, it means the first item is between the patterns
    if( s2.length > 1 ){
        s2[0] = s2[0] 
          ? cb(s2[0]) // replace the array item with whatever
          : interpolator.join('') // nothing was between the interpolation pattern
    }

    return s2.join('') // merge splited array (part2)
  }).join('') // merge everything 
}
input{ 
  padding:5px; 
  width: 100%; 
  box-sizing: border-box;
  margin-bottom: 20px;
}

*{
  font: 14px Arial;
  padding:5px;
}
<input value="Everything between {{}} is {{processed}}" />
<div></div>


0

ในขณะที่แม่แบบที่น่าจะดีที่สุดสำหรับกรณีที่คุณอธิบายถ้าคุณมีหรือต้องการให้ข้อมูลและ / หรือข้อโต้แย้งของคุณในรูปแบบ iterable / String.rawอาร์เรย์คุณสามารถใช้

String.raw({
  raw: ["I'm ", " years old!"]
}, 3);

ด้วยข้อมูลเป็นอาร์เรย์หนึ่งสามารถใช้ตัวดำเนินการแพร่กระจาย:

const args = [3, 'yesterday'];
String.raw({
  raw: ["I'm ", " years old as of ", ""]
}, ...args);

0

ไม่พบสิ่งที่ฉันกำลังมองหาแล้วพบมัน -

หากคุณใช้ Node.js มีutilแพ็คเกจในตัวพร้อมฟังก์ชั่นรูปแบบที่ใช้งานได้ดังนี้

util.format("Hello my name is %s", "Brent");
> Hello my name is Brent

บังเอิญตอนนี้ถูกสร้างขึ้นมาในconsole.logรสชาติด้วยใน Node.js -

console.log("This really bad error happened: %s", "ReferenceError");
> This really bad error happened: ReferenceError
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.