मैं जावास्क्रिप्ट स्ट्रिंग्स के अंदर चर कैसे डालूं? (Node.js)


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

कि आप इसे अजगर में कैसे करते हैं। आप इसे जावास्क्रिप्ट / नोड.जेएस में कैसे कर सकते हैं?


1
मुझे यकीन है कि ऐसा करने के लिए एक एस-अगला स्ट्रोमैन कहीं थाvar s = 'hello ${my_name}, how are you doing';
रेयनोस

1
मैं उपयोग करता हूं जैसा कि रेयनोस ने कहा: कॉन्स्ट कविता = "द ब्लैक रिवर"; const लेखक = "जोसेफ ट्रोल"; const favePoem = `मेरी पसंदीदा कविता $ {कविता} $ {लेखक} \ _ है। या आप उपयोग कर सकते हैं: कंसोल.लॉग ('% s% d है।', 'ग्यारह', 11);
गिल्बर्टो बी। टेरा जूनियर

जवाबों:


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
यह मूल रूप से सबसे अच्छा आपको मिलेगा क्योंकि यह सीधे भाषा द्वारा समर्थित नहीं है क्योंकि यह अजगर में है।
जिम स्कुबर्ट

अन्य उत्तर, जिसमें फीचर.फॉर्मैट () शामिल है, को स्वीकृत उत्तर होना चाहिए ... हालांकि अधिमानतः इसमें ईएस 6 के टेम्प्लेट स्ट्रिंग्स का भी उल्लेख होगा (जो 2011 में स्वीकार नहीं किया गया था)। हमें वास्तव में पुराने प्रश्नों को अद्यतन रखने में सक्षम होना चाहिए। : \
काइल बेकर

1
@FelixKling, चूंकि आप स्वीकृत उत्तर हैं, क्या आप अन्य सही उपयोगों को इंगित करने के लिए अपने स्वयं के उत्तर को अपडेट कर सकते हैं?
काइल बेकर

1
यह अच्छा है, टेम्पलेट शाब्दिक बिल्कुल एक ही बात नहीं है
thevangelist

"तर्कों" का उपयोग करते समय मेरे पास एक मुद्दा था। जब कई ग्राहक पार्स से गुजरे, तो "स्ट्रैट" मिलाया गया। कोई स्पष्टीकरण?
tspentzas

405

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

आपको ` इसके बजाय बैकटिक के भीतर स्ट्रिंग लपेटने की आवश्यकता है'


1
प्लस 1 क्योंकि हम 2017 में हैं और ईएस 6 मूल रूप से नोड दुनिया में मानक है।
Jankapunkt

1
यह अब (2017) सही उत्तर है। ध्यान रखें कि पुराने ब्राउज़र का समर्थन करने के लिए आपको अपने टूलकिन में बैबेल की आवश्यकता होगी।
superluminary

3
मैंने नोड.जेएस डेवलपर्स को सुझाव दिया है कि यह वास्तव में उपयोगी होगा जैसे कि नोडज्स ओआरजी / पापी / ट्रेडलाइन। Html जैसे पृष्ठों पर यह स्पष्ट हो कि यह एक बैकटिक है। : वहाँ इसे यहाँ के लिए एक मुद्दा था github.com/nodejs/docs/issues/55
गेल Foad

अपने आप को बैकटिक जाल, टिप्पणी के लिए धन्यवाद के लिए गिर गया;)
Overdrivr

3
क्या होगा अगर मेरा स्ट्रिंग कॉन्फ़िगरेशन फ़ाइल का एक हिस्सा है hello ${my_name}, how are you doingऔर मैं विन्यास से स्ट्रिंग पढ़ने के बाद गतिशील रूप से चर असाइन करना चाहता हूं?
अमरेश त्यागी

49

यदि आप ES6 का उपयोग कर रहे हैं, तो आपको टेम्पलेट शाब्दिक का उपयोग करना चाहिए।

//you can do this
let sentence = `My name is ${ user.name }. Nice to meet you.`

यहाँ और अधिक पढ़ें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals


1
वर्तमान में यह एक बेहतर जवाब है।
वी-जेई

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
"एकल उद्धरण के बजाय 'झुकाव'" आप दिन बचा सकते हैं :)
मारियो बिंदर

40

use.format ऐसा करता है।

यह v0.5.3 का हिस्सा होगा और इसे इस तरह इस्तेमाल किया जा सकता है:

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

3
अच्छा, टिप के लिए धन्यवाद! कंसोल.लॉग ('% s', मूल्य) भी काम करना चाहिए।
अज़ात

14

वो करें:

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

अपडेट करें

ES6 के साथ, आप यह भी कर सकते हैं:

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

आपका क्या मतलब है "इसके संभव नहीं"? : यदि आपको फ़ॉर्मेट किया हुआ पाठ पसंद है तो आप इसे ऊपर वर्णित फेलिक्स क्लिंग द्वारा कर सकते हैं। यह सबसे अच्छा जवाब है जैसा कि मैं यहां देख रहा हूं;) :)
मरिअनोस निकोस

@TIMEX यह संभव है कि यह एक कोशिश दे।
देव_खान

5

String.prototypeES2015 टेम्पलेट शाब्दिकों का विस्तार या उपयोग करने के कुछ तरीके ।

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 का उपयोग कर रहे हैं, तो कंसोल .log () पहले पैरामीटर के रूप में प्रारूप स्ट्रिंग लेता है:

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

यह एक अच्छा बिंदु है, लेकिन सवाल स्ट्रिंग इंटरपोलेशन के बारे में है। console.log()केवल स्वरूपित स्ट्रिंग को आउटपुट करता है STDOUT। दूसरे शब्दों में, आप का नतीजा उपयोग नहीं कर सकतेcount: %d
जिम 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

मैंने एक फ़ंक्शन लिखा, जो समस्या को हल करता है।

पहला तर्क वह स्ट्रिंग है जिसे पैरामीटर बनाना चाहते थे। आपको अपना चर इस प्रारूप में "% 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';

मैं उस के साथ कुछ समस्याओं को देखता हूं; यह स्ट्रिंग फ़ॉर्मेटिंग के बजाय कॉन्सेटेशन का उपयोग करता है जो कोड समीक्षा करते समय मेरे लिए एक लाल झंडा है, क्योंकि इसे पढ़ना और बनाए रखना आमतौर पर अधिक कठिन होता है। इसके अलावा, आप एक रिट्रीवल सिस्टम में उस "पैटर्न" को सुरक्षित रूप से संग्रहीत नहीं कर सकते हैं (जैसे एक कॉन्फ़िगरेशन फ़ाइल या डीबी) और बाद में उपयोगकर्ता के मूल्य में इंजेक्ट करें।
रोरी ब्राउन ने

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
>

इसे एक टेम्प्लेट स्ट्रिंग कहा जाता है , और आप इस मौजूदा उत्तर
बर्गी

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