স্থানধারক এবং বিকল্পের কোনও অবজেক্ট ব্যবহার করে একটি জাভাস্ক্রিপ্ট স্ট্রিং ফর্ম্যাট করবেন?


92

আমার বলার সাথে একটি স্ট্রিং রয়েছে: My Name is %NAME% and my age is %AGE%.

%XXX%স্থানধারক হয়। আমাদের সেখানে একটি বস্তু থেকে মানগুলি পরিবর্তন করতে হবে।

অবজেক্টটি দেখে মনে হচ্ছে: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}

আমাকে অবজেক্টটি বিশ্লেষণ করতে হবে এবং স্ট্রিংটিকে সংশ্লিষ্ট মানগুলির সাথে প্রতিস্থাপন করতে হবে। সুতরাং যে চূড়ান্ত আউটপুট হবে:

আমার নাম মাইক এবং আমার বয়স 26 বছর।

পুরো জিনিসটি খাঁটি জাভাস্ক্রিপ্ট বা jquery ব্যবহার করে করতে হবে।


4
এটি অ্যারের চেয়ে কোনও অবজেক্টের মতো দেখায়
জোয়েল কোহোর্ন

4
এ পর্যন্ত কি কি চেষ্টা করেছ? আপনি কি রেখাচিত্রমালা () পদ্ধতিটি দেখেছেন ? (এছাড়াও, আপনার সেখানে কোনও অ্যারে নেই, আপনার একটি জিনিস রয়েছে))
nnnnnn

4
এটা বেশ কুৎসিত। নিশ্চয় আপনি ঠিক পাশাপাশি পরিবেশন করা হবে {NAME: "Mike", AGE: 26, EVENT: 20}? আপনার এখনও দরকার যে এই কীগুলি অবশ্যই অবশ্যই ইনপুট স্ট্রিংয়ে শতাংশ লক্ষণ দ্বারা উত্সাহিত হবে।
ডেভিডচেমার্স

উত্তর:


152

মূল প্রশ্নের প্রয়োজনীয়তাগুলি স্পষ্টভাবে স্ট্রিং প্রবৃদ্ধি থেকে উপকার করতে পারে না, কারণ মনে হচ্ছে এটি নির্বিচারে প্রতিস্থাপন কীগুলির রানটাইম প্রক্রিয়াজাতকরণ।

তবে , যদি আপনাকে কেবল স্ট্রিং ইন্টারপোলেশন করতে হয় তবে আপনি ব্যবহার করতে পারেন:

const str = `My name is ${replacements.name} and my age is ${replacements.age}.`

স্ট্রিংটি সীমিত করে ব্যাকটিকগুলি নোট করুন, সেগুলি প্রয়োজনীয়।


নির্দিষ্ট ওপির প্রয়োজন অনুসারে একটি উত্তরের জন্য, আপনি String.prototype.replace()প্রতিস্থাপনগুলির জন্য ব্যবহার করতে পারেন ।

নিম্নলিখিত কোডটি সমস্ত ম্যাচ পরিচালনা করবে এবং কোনও প্রতিস্থাপন ছাড়াই এগুলি স্পর্শ করবে না (যতক্ষণ না আপনার প্রতিস্থাপনের মানগুলি সমস্ত স্ট্রিং হয়, যদি না হয় তবে নীচে দেখুন)।

var replacements = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"},
    str = 'My Name is %NAME% and my age is %AGE%.';

str = str.replace(/%\w+%/g, function(all) {
   return replacements[all] || all;
});

jsFizz

যদি আপনার কিছু প্রতিস্থাপন স্ট্রিং না হয় তবে নিশ্চিত হয়ে নিন যে তারা প্রথমে অবজেক্টে রয়েছে। আপনার যদি উদাহরণের মতো ফর্ম্যাট থাকে, যেমন শতাংশের চিহ্নগুলিতে আবৃত থাকে তবে আপনি এটি inঅর্জন করতে অপারেটরটি ব্যবহার করতে পারেন ।

jsFizz

তবে, যদি আপনার ফর্ম্যাটের একটি বিশেষ বিন্যাস না থাকে, যেমন কোনও স্ট্রিং না থাকে এবং আপনার প্রতিস্থাপনের অবজেক্টে nullপ্রোটোটাইপ না থাকে , ব্যবহার করুন Object.prototype.hasOwnProperty(), আপনি যদি গ্যারান্টি দিতে না পারেন তবে আপনার সম্ভাব্য প্রতিস্থাপন সাবস্ট্রিংগুলির কোনওটিই প্রোটোটাইপের সংখ্যার নামের সাথে সংঘর্ষ করবে না।

jsFizz

অন্যথায়, যদি আপনার প্রতিস্থাপনের স্ট্রিংটি থাকে 'hasOwnProperty', আপনি একটি ফলাফল বিশৃঙ্খলাযুক্ত স্ট্রিং পাবেন।

jsFizz


একটি সাইড নোট হিসাবে, আপনি বলা উচিত replacementsএকটি Object, একটি না Array


4
+1 ভাল লাগল যদিও আপনি মামলা return replacements[all] || allকভার করতে বলতে চাইতে পারেন %NotInReplacementsList%
nnnnnn

6
প্রতিস্থাপনের মানটি মিথ্যা হলে এটি কাজ করবে না। সুতরাং এই রিটার্নের বিবৃতিটি ব্যবহার করা আরও ভাল:return all in params ? params[all] : all;
মাইকেল হার্টল

@ মাইকেলহার্টল আপনার প্রতিস্থাপনগুলি সমস্ত স্ট্রিং হওয়া উচিত নয়? আপনি যদি খালি স্ট্রিং দিয়ে প্রতিস্থাপন করতে চান তবে অন্য উপায় দিয়ে পরীক্ষা করা ভাল।
অ্যালেক্স

4
@ অ্যালেক্স আমার এমন পরিস্থিতি ছিল যেখানে প্রতিস্থাপনগুলিও পূর্ণসংখ্যা এবং এমনকি হতে পারে 0। এই ক্ষেত্রে এটি কাজ করে না।
মাইকেল হার্টল

@ মাইকেলহর্টল সেই মামলাটি কভার করতে আপডেট করেছেন।
অ্যালেক্স

24

ES6 টেম্পলেট আক্ষরিক ব্যবহার সম্পর্কে?

var a = "cat";
var b = "fat";
console.log(`my ${a} is ${b}`); //notice back-ticked string

টেম্পলেট আক্ষরিক সম্পর্কে আরও ...


4
যদি ওপি এর মতো স্থানধারীদের সাথে আপনার কোনও অবজেক্ট থাকে তবে স্ট্রিং ইন্টারপোলেশন কীভাবে সহায়তা করে?
অ্যালেক্স

একটি যাদুমন্ত্র মত কাজ করে! আমার স্থানধারিত সমস্যার সর্বাধিক ব্যবহারিক সমাধান, নিখুঁত।
বেরুস

এই সমাধান রানটাইম প্রতিস্থাপনের জন্য কাজ করে না
থিয়েরি জে

13

এটিকে সহজে কাজ করতে আপনি JQuery (jquery.uthorate.js) ব্যবহার করতে পারেন।

$.validator.format("My name is {0}, I'm {1} years old",["Bob","23"]);

অথবা আপনি যদি কেবল সেই বৈশিষ্ট্যটি ব্যবহার করতে চান তবে আপনি সেই ফাংশনটি সংজ্ঞায়িত করতে পারেন এবং কেবল এটির মতো ব্যবহার করতে পারেন

function format(source, params) {
    $.each(params,function (i, n) {
        source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
    })
    return source;
}
alert(format("{0} is a {1}", ["Michael", "Guy"]));

jquery.uthorate.js টিমকে ক্রেডিট


4
আপনি অবশ্যই এই জন্য এই প্লাগইনটি লোড করতে চাইবেন না, তবে পৃষ্ঠায় একটি ফর্মটি যাচাই করতে আমি ইতিমধ্যে এটি ব্যবহার করছি ... তাই টিপটির জন্য ধন্যবাদ!
নাব্রাউন

4
প্রতিটি সংখ্যার জন্য একটি রেজেক্স তৈরি করতে বেশ অদক্ষ, সমস্ত সংখ্যার সাথে মিলিয়ে নেওয়া ভাল হবে এবং তারপরে যদি মানটি অ্যারেটিতে পাওয়া যায় তবে এটি প্রতিস্থাপন করা ভাল?
অ্যালেক্স

যারা আগ্রহী তাদের জন্য এটি এখানে ঘটে: github.com/jquery-uthoration/jquery-uthoration/blob/master/src/…
রাফেল সি

4
+ খুব সুন্দর ... এবং $.eachআপনার পক্ষে এটি তৈরি করা সম্ভব হয়েছিল String.prototype.format=function(p){var s=this,r=function(v,i){s=s.replace(new RegExp("\\{"+i+"\\}","g"),v);};p.forEach(r);return s;}যাতে আপনার কেবল সেই একের জন্য jquery অন্তর্ভুক্ত করতে হবে না;)
লারফোয়েড

11

আধুনিক ব্রাউজারের মতো, প্লেসোল্ডার সি স্টাইল ফাংশনের মতো ক্রোম / ফায়ারফক্সের নতুন সংস্করণ দ্বারা সমর্থিত printf()

স্থানধারক:

  • %s স্ট্রিং।
  • %d, %iপূর্ণসংখ্যা নম্বর।
  • %f ফ্লোটিং পয়েন্ট সংখ্যা.
  • %o হাইপারলিঙ্ক অবজেক্ট।

যেমন

console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2);

বিটিডব্লিউ, আউটপুটটি দেখতে:

  • ক্রোমে শর্টকাট Ctrl + Shift + Jবা F12বিকাশকারী সরঞ্জাম খুলতে ব্যবহার করুন ।
  • ফায়ারফক্সে, শর্টকাট Ctrl + Shift + Kবা F12বিকাশকারী সরঞ্জাম খুলতে ব্যবহার করুন ।

@ আপডেট - নোডেজ সমর্থন

মনে হচ্ছে নোডেজগুলি সমর্থন করে না %f, পরিবর্তে %dনোডেজগুলিতে ব্যবহার করতে পারে । %dসংখ্যা সহ কেবল পূর্ণসংখ্যার হিসাবে নয়, ভাসমান সংখ্যা হিসাবে মুদ্রিত হবে।


6

শুধু ব্যবহার replace()

var values = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"};
var substitutedString = "My Name is %NAME% and my age is %AGE%.".replace("%NAME%", $values["%NAME%"]).replace("%AGE%", $values["%AGE%"]);

4
বাধ্যতামূলক "দয়া করে একটি রেফারেন্স হিসাবে MDN ব্যবহার করুন": বিকাশকারী.মোজিলা.আর.ইন
জাভা স্ক্রিপ্ট /


5

আপনি এটির মতো একটি কাস্টম প্রতিস্থাপন ফাংশন ব্যবহার করতে পারেন:

var str = "My Name is %NAME% and my age is %AGE%.";
var replaceData = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"};

function substitute(str, data) {
    var output = str.replace(/%[^%]+%/g, function(match) {
        if (match in data) {
            return(data[match]);
        } else {
            return("");
        }
    });
    return(output);
}

var output = substitute(str, replaceData);

আপনি এটি এখানে কাজ করতে দেখতে পারেন: http://jsfiddle.net/jfriend00/DyCwk/


4
শীতল, অ্যালেক্স ঠিক একই জিনিসটি করেছিলেন তবে কোডের কয়েকটি কম লাইনে (যদিও টের্নারি অপারেটরগুলি সম্ভবত..এলএসের চেয়ে ধীরে ধীরে)।
রবজি

আরে, আমি আপনাকে একটি +1 দিয়েছি! আপনি উভয় একটি প্রতিস্থাপন ফাংশন করেছেন, আপনার ঠিক একই নয় তবে বেশ অনুরূপ। আপনার রেজিএক্সপেক্সটিও আলাদা, ওপেন%% বা $$ বা ডিলিমিটার হিসাবে সমান ব্যবহার করা ভাল - একক% বা% সাধারণত স্ট্রিংয়ের মধ্যে সম্ভবত ঘটে থাকে তবে ডাবলসের সম্ভাবনা কম।
রবজি

4

আপনি যদি কনসোল.লগের কাছাকাছি কিছু করতে চান তবে% s স্থানধারীদের প্রতিস্থাপনের মতো

>console.log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright")
>Hello Loreto how are you today is everything allright?

আমি এটি লিখেছি

function log() {
  var args = Array.prototype.slice.call(arguments);
  var rep= args.slice(1, args.length);
  var i=0;
  var output = args[0].replace(/%s/g, function(match,idx) {
    var subst=rep.slice(i, ++i);
    return( subst );
  });
   return(output);
}
res=log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright");
document.getElementById("console").innerHTML=res;
<span id="console"/>

তুমি পাবে

>log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright")
>"Hello Loreto how are you today is everything allright?"

হালনাগাদ

String.prototypeস্ট্রিং ট্রান্সফর্মেশনগুলির সাথে কাজ করার সময় আমি দরকারী হিসাবে একটি সহজ বৈকল্পিক যুক্ত করেছি , এটি এখানে:

String.prototype.log = function() {
    var args = Array.prototype.slice.call(arguments);
    var rep= args.slice(0, args.length);
    var i=0;
    var output = this.replace(/%s|%d|%f|%@/g, function(match,idx) {
      var subst=rep.slice(i, ++i);
      return( subst );
    });
    return output;
   }

সেক্ষেত্রে আপনি করবেন

"Hello %s how are you %s is everything %s?".log("Loreto", "today", "allright")
"Hello Loreto how are you today is everything allright?"

এই সংস্করণটি এখানে চেষ্টা করে দেখুন


4
আমি এগুলির নমুনা ছাড়া আপনার ফাংশন উপর একটি প্রকরণ তৈরি formatMessage(message: string, values: string[]) { let i = 0; return message.replace(/%\w+%/g, (match, idx) => { return values[i++]; }); } এই বিন্যাসে এবং জন্য মান এবং সৌন্দর্য প্রতিস্থাপন অ্যারে বার্তা লাগে%SOME_VALUE%
বাকু

4

বর্তমানে জাভাস্ক্রিপ্টে এই আচরণের কোনও দেশীয় সমাধান নেই। ট্যাগযুক্ত টেম্পলেটগুলি সম্পর্কিত কিছু তবে এটি সমাধান করবেন না।

প্রতিস্থাপনের জন্য এখানে একটি অ্যালেক্সের দ্রবণের রিফ্যাক্টর রয়েছে ।

সমাধানটি তীর ফাংশনগুলিতে ( পরিবর্তে ) নেটিভ জাভাস্ক্রিপ্ট ইন্টারপোলেশন হিসাবে স্থানধারীদের জন্য তীর ফাংশন এবং অনুরূপ সিনট্যাক্স ব্যবহার করে । এছাড়াও আছে বিভেদক অন্তর্ভুক্ত করা কোন প্রয়োজন ({}%%% প্রতিস্থাপনের নামে ) ।

দুটি স্বাদ রয়েছে: বর্ণনামূলক এবং হ্রাস।

বর্ণনামূলক সমাধান:

const stringWithPlaceholders = 'My Name is {name} and my age is {age}.';

const replacements = {
  name: 'Mike',
  age: '26',
};

const string = stringWithPlaceholders.replace(
  /{\w+}/g,
  placeholderWithDelimiters => {
    const placeholderWithoutDelimiters = placeholderWithDelimiters.substring(
      1,
      placeholderWithDelimiters.length - 1,
    );
    const stringReplacement = replacements[placeholderWithoutDelimiters] || placeholderWithDelimiters;
    return stringReplacement;
  },
);

console.log(string);

হ্রাস সমাধান:

const stringWithPlaceholders = 'My Name is {name} and my age is {age}.';

const replacements = {
  name: 'Mike',
  age: '26',
};

const string = stringWithPlaceholders.replace(/{\w+}/g, placeholder =>
  replacements[placeholder.substring(1, placeholder.length - 1)] || placeholder,
);

console.log(string);


4
এর জন্য ধন্যবাদ, একটি স্থানধারক স্ট্রিংয়ের জন্য একটি জেনেরিক সমাধান এবং এটির সাথে এইভাবে একত্রীকরণের জন্য একটি দুর্দান্ত সমাধান পাওয়া ভাল
কার্লোস পি

@ কার্লোসপ, এই ধারণাটি, একটি সাধারণ সমাধান করার জন্য। তবে আমি মনে করি এটি ভাষার একটি স্থানীয় ভাষা হওয়া উচিত, কারণ এটি সাধারণ ব্যবহারের ক্ষেত্রে।
এএমএস 777

4
এটির মতো রেজিেক্স গ্রুপগুলি ব্যবহার করে এটি আরও কিছুটা সরল করা যায়:stringWithPlaceholders.replace(/{(\w+)}/g, (fullMatch, group1) => replacements[group1] || fullMatch )
কেড

2

এটি আপনাকে ঠিক তা করতে দেয়

এনপিএম: https://www.npmjs.com/package/stringinject

গিটহাব: https://github.com/tjcafferkey/stringinject

নিম্নলিখিতগুলি করে:

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

// My username is tjcafferkey on Git

4
তবে যেহেতু আপনি es6 এ এটি করতে পারেন এটি সম্ভবত কিছুটা ওভারকিল?
আয়নিকবার্গ

4
এটি আপনাকে স্ট্রিংটিকে এক বিন্যাসে এক জায়গায় সংরক্ষণ করতে দেয় এবং তারপরে পরবর্তী সময়ে কেবলমাত্র একটি ফাংশন ব্যবহার করে সংশ্লিষ্ট আইটেমগুলিকে প্রতিস্থাপন করে। এটি আমার জ্ঞানের পক্ষে এস template টেম্পলেট আক্ষরিক সাথে করা সম্ভব নয়। এর জন্য ব্যবহারের অর্থ হ'ল অনুবাদ স্ট্রিং যেখানে আপনি অন্য কোথাও স্ট্রিংটি গ্রাস করবেন এবং সেখানে পছন্দসই মানগুলি ইনজেক্ট করবেন।
জোহান পার্সসন 17

2

রানটাইম সময়ে গতিশীলভাবে এস 6 টেম্পলেট লিটারাল ব্যবহার করে এটি করার আরেকটি উপায়।

const str = 'My name is ${name} and my age is ${age}.'
const obj = {name:'Simon', age:'33'}


const result = new Function('const {' + Object.keys(obj).join(',') + '} = this.obj;return `' + str + '`').call({obj})

document.body.innerHTML = result


1

দ্রুত উদাহরণ হিসাবে:

var name = 'jack';
var age = 40;
console.log('%s is %d yrs old',name,age);

আউটপুটটি হ'ল:

জ্যাক 40 বছরের পুরানো


7
এটি দুর্দান্ত, যদি না আপনি কনসোলে লগইন করা ছাড়াও কিছু করতে চান।
অ্যালেক্স

13
তা হওয়া উচিত নয় console.log?
ড্রাজস

0
const stringInject = (str = '', obj = {}) => {
  let newStr = str;
  Object.keys(obj).forEach((key) => {
    let placeHolder = `#${key}#`;
    if(newStr.includes(placeHolder)) {
      newStr = newStr.replace(placeHolder, obj[key] || " ");
    }
  });
  return newStr;
}
Input: stringInject("Hi #name#, How are you?", {name: "Ram"});
Output: "Hi Ram, How are you?"

0

আমি একটি কোড লিখেছি যা আপনাকে স্ট্রিংকে সহজেই বিন্যাস করতে দেয়।

এই ফাংশনটি ব্যবহার করুন।

function format() {
    if (arguments.length === 0) {
        throw "No arguments";
    }
    const string = arguments[0];
    const lst = string.split("{}");
    if (lst.length !== arguments.length) {
        throw "Placeholder format mismatched";
    }
    let string2 = "";
    let off = 1;
    for (let i = 0; i < lst.length; i++) {
        if (off < arguments.length) {
            string2 += lst[i] + arguments[off++]
        } else {
            string2 += lst[i]
        }
    }
    return string2;
}

উদাহরণ

format('My Name is {} and my age is {}', 'Mike', 26);

আউটপুট

আমার নাম মাইক এবং আমার বয়স 26 বছর

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.