जावास्क्रिप्ट में तारों के बीच के अंतर को कैसे सुधारा जा सकता है?


408

मुझे पता है कि PHP में हम ऐसा कुछ कर सकते हैं:

$hello = "foo";
$my_string = "I pity the $hello";

आउटपुट: "I pity the foo"

मैं सोच रहा था कि क्या यही बात जावास्क्रिप्ट में भी संभव है। संघनन का उपयोग किए बिना स्ट्रिंग के अंदर चर का उपयोग करना - यह लिखने के लिए अधिक संक्षिप्त और सुरुचिपूर्ण दिखता है।

जवाबों:


695

आप टेम्पलेट साहित्य का लाभ उठा सकते हैं और इस वाक्य रचना का उपयोग कर सकते हैं :

`String text ${expression}`

टेम्पलेट शाब्दिक डबल या सिंगल कोट्स के बजाय बैक-टिक (``) (गंभीर उच्चारण) द्वारा संलग्न हैं ।

इस फीचर को ES2015 (ES6) में पेश किया गया है।

उदाहरण

var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b}.`);
// "Fifteen is 15.

कितना साफ है?

बक्शीश:

यह जावास्क्रिप्ट के लिए मल्टी-लाइन स्ट्रिंग्स को भागने के बिना भी अनुमति देता है, जो टेम्पलेट्स के लिए बहुत अच्छा है:

return `
    <div class="${foo}">
         ...
    </div>
`;

ब्राउज़र समर्थन :

जैसा कि यह सिंटैक्स पुराने ब्राउज़रों (ज्यादातर इंटरनेट एक्सप्लोरर) द्वारा समर्थित नहीं है, आप अपने कोड को ES5 में ट्रांसपाइल करने के लिए बैबल / वेबपैक का उपयोग करना चाह सकते हैं ताकि यह सुनिश्चित हो सके कि यह हर जगह चलेगा।


पक्षीय लेख:

IE8 + से शुरू करके आप मूल स्ट्रिंग स्वरूपण का उपयोग कर सकते हैं console.log:

console.log('%s is %d.', 'Fifteen', 15);
// Fifteen is 15.

56
इस तथ्य को याद न करें कि टेम्प्लेट स्ट्रिंग आपके सामान्य उद्धरण वर्णों के बजाय वापस टिक (`) के साथ सीमांकित है। "${foo}"वस्तुतः $ {foo} `${foo}`है जो आप वास्तव में चाहते हैं
होविस बिडल

1
इसके अलावा संगतता मुद्दे को तय करने के लिए ES6 को ES5 में बदलने के लिए कई ट्रांसपॉयलर हैं!
निक

जब मैं एक या बी मान को बदलता हूं। कंसोल.लॉग ( Fifteen is ${a + b}.); गतिशील रूप से परिवर्तित नहीं होता है। यह हमेशा दिखाता है कि पंद्रह 15 है
धरान

168

से पहले फ़ायरफ़ॉक्स 34 / क्रोम 41 / सफारी 9 / माइक्रोसॉफ्ट एज, नहीं, कि जावास्क्रिप्ट में संभव नहीं था। आपको इसका सहारा लेना होगा:

var hello = "foo";
var my_string = "I pity the " + hello;

2
यह जल्द ही टेम्पलेट स्ट्रिंग्स के साथ जावास्क्रिप्ट (ES6) में संभव होगा, नीचे मेरा विस्तृत जवाब देखें।
12

यदि आप CoffeeScript लिखना पसंद करते हैं, तो यह संभव है , जो वास्तव में एक बेहतर सिंटैक्स के साथ जावास्क्रिप्ट है।
bformet

1
पुराने ब्राउज़रों के लिए शानदार चिल्लाहट :)
Kirsty Marks

1
मुझे FOO पर दया आती है !!! यह बहुत अच्छा है
एडम ह्यूजेस

42

से पहले फ़ायरफ़ॉक्स 34 / क्रोम 41 / सफारी 9 / माइक्रोसॉफ्ट एज, नहीं। यद्यपि आप जावास्क्रिप्ट के लिए स्प्रिंटफ की कोशिश कर सकते हैं कि वहां आधा हो जाए:

var hello = "foo";
var my_string = sprintf("I pity the %s", hello);

धन्यवाद। यदि आप डोज़ो
१.९ /

32

अच्छी तरह से आप यह कर सकते हैं, लेकिन यह सामान्य नहीं है

'I pity the $fool'.replace('$fool', 'fool')

आप आसानी से एक फ़ंक्शन लिख सकते हैं जो यह समझदारी से करता है यदि आपको वास्तव में ज़रूरत है


बहुत सभ्य, वास्तव में।
श्री बी।

1
यह उत्तर अच्छा है जब आपको डेटाबेस में टेम्पलेट स्ट्रिंग को स्टोर करने और इसे मांग पर संसाधित करने की आवश्यकता होती है
डिमा एस्केरोडा

अच्छा है, यह अच्छा काम करता है। बहुत सरल लेकिन दिमाग में नहीं आया।
सैम

13

पूरा जवाब, उपयोग के लिए तैयार:

 var Strings = {
        create : (function() {
                var regexp = /{([^{]+)}/g;

                return function(str, o) {
                     return str.replace(regexp, function(ignore, key){
                           return (key = o[key]) == null ? '' : key;
                     });
                }
        })()
};

के रूप में बुलाओ

Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'});

इसे String.prototype से संलग्न करने के लिए:

String.prototype.create = function(o) {
           return Strings.create(this, o);
}

तो के रूप में उपयोग करें:

"My firstname is ${first}".create({first:'Neo'});

10

आप इस प्रकार के टेंपलेटिंग करने के लिए इस जावास्क्रिप्ट फ़ंक्शन का उपयोग कर सकते हैं। पूरे पुस्तकालय को शामिल करने की आवश्यकता नहीं है।

function createStringFromTemplate(template, variables) {
    return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){
        return variables[varName];
    });
}

createStringFromTemplate(
    "I would like to receive email updates from {list_name} {var1} {var2} {var3}.",
    {
        list_name : "this store",
        var1      : "FOO",
        var2      : "BAR",
        var3      : "BAZ"
    }
);

उत्पादन :"I would like to receive email updates from this store FOO BAR BAZ."

String.replace () फ़ंक्शन के तर्क के रूप में फ़ंक्शन का उपयोग करना ECMAScript v3 कल्पना का हिस्सा था। देखें इस अतः जवाब अधिक जानकारी के लिए।


क्या यह कुशल है?
एमएमएम

दक्षता उपयोगकर्ता के ब्राउज़र पर काफी हद तक निर्भर करती है, क्योंकि यह समाधान regex के मिलान और ब्राउज़र के मूल कार्यों के लिए स्ट्रिंग प्रतिस्थापन करने के "भारी उठाने" को दर्शाता है। किसी भी मामले में, चूंकि यह ब्राउज़र-साइड पर वैसे भी हो रहा है, इसलिए दक्षता इतनी बड़ी चिंता नहीं है। यदि आप सर्वर-साइड टेंपलेटिंग (Node.JS या इस तरह के लिए) चाहते हैं, तो आपको @bformet द्वारा वर्णित ES6 टेम्पलेट शाब्दिक समाधान का उपयोग करना चाहिए, क्योंकि यह अधिक कुशल है।
एरिक सस्टैंडैंड

9

यदि आप CoffeeScript लिखना पसंद करते हैं, तो आप कर सकते हैं:

hello = "foo"
my_string = "I pity the #{hello}"

कॉफीस्क्रिप्ट वास्तव में जावास्क्रिप्ट है, लेकिन बहुत बेहतर वाक्य रचना के साथ।

CoffeeScript के अवलोकन के लिए इसे देखें शुरुआती गाइड की


4

यदि आप माइक्रोटेमप्लेटिंग के लिए प्रक्षेप करने की कोशिश कर रहे हैं, तो मुझे उस उद्देश्य के लिए मूंछें पसंद हैं ।


3

मैंने यह npm पैकेज stringinject लिखा है https://www.npmjs.com/package/stringinject जो आपको निम्नलिखित कार्य करने की अनुमति देता है

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);

जो सरणी आइटम के साथ {0} और {1} को प्रतिस्थापित करेगा और निम्नलिखित स्ट्रिंग लौटाएगा

"this is a test string for stringInject"

या आप प्लेसहोल्डर्स को ऑब्जेक्ट कुंजियों और मानों जैसे बदल सकते हैं:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });

"My username is tjcafferkey on Github" 

3

मैं बैक-टिक `` का उपयोग करूँगा।

let name1 = 'Geoffrey';
let msg1 = `Hello ${name1}`;
console.log(msg1); // 'Hello Geoffrey'

लेकिन अगर आपको पता नहीं है कि name1आप कब बनाते हैंmsg1

छूट के लिए अगर msg1एक एपीआई से आया है।

आप उपयोग कर सकते हैं :

let name2 = 'Geoffrey';
let msg2 = 'Hello ${name2}';
console.log(msg2); // 'Hello ${name2}'

const regexp = /\${([^{]+)}/g;
let result = msg2.replace(regexp, function(ignore, key){
    return eval(key);
});
console.log(result); // 'Hello Geoffrey'

यह ${name2}उसके मूल्य के साथ बदल जाएगा ।


2

यहां उल्लिखित किसी भी बाहरी पुस्तकालय को न देखें, लेकिन लॉडश के पास है _.template() ,

https://lodash.com/docs/4.17.10#template

यदि आप पहले से ही पुस्तकालय का उपयोग कर रहे हैं, तो यह जाँच के लायक है, और यदि आप लोदश का उपयोग नहीं कर रहे हैं, तो आप हमेशा npm से चेरी के तरीके चुन सकते हैं npm install lodash.template सकते हैं, ताकि आप ओवरहेड को काट सकें।

सबसे सरल तरीका -

var compiled = _.template('hello <%= user %>!');
compiled({ 'user': 'fred' });
// => 'hello fred!'

कॉन्फ़िगरेशन विकल्पों का एक गुच्छा भी है -

_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
var compiled = _.template('hello {{ user }}!');
compiled({ 'user': 'mustache' });
// => 'hello mustache!'

मुझे कस्टम सीमांकक सबसे दिलचस्प लगा।


0

String.format()जावा के समान एक विधि बनाएं

StringJoin=(s, r=[])=>{
  r.map((v,i)=>{
    s = s.replace('%'+(i+1),v)
  })
return s
}

उपयोग

console.log(StringJoin('I can %1 a %2',['create','method'])) //output: 'I can create a method'

0

2020 की शांति बोली:

Console.WriteLine("I {0} JavaScript!", ">:D<");

console.log(`I ${'>:D<'} C#`)


-1
String.prototype.interpole = function () {
    var c=0, txt=this;
    while (txt.search(/{var}/g) > 0){
        txt = txt.replace(/{var}/, arguments[c]);
        c++;
    }
    return txt;
}

uso:

var hello = "foo";
var my_string = "I pity the {var}".interpole(hello);
//resultado "I pity the foo"

-2

var hello = "foo";

var my_string ="I pity the";

कंसोल.लॉग (my_string, हैलो)


1
इस सवाल का जवाब नहीं है। आप एक पंक्ति में दोनों स्ट्रिंग्स को लॉग आउट कर सकते हैं, लेकिन यह आपको दोनों तारों को एक नया स्ट्रिंग नहीं देता है, जो कि ओपी के लिए पूछ रहा है।
मैक्स वोल्मर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.