ฉันพยายามย้ายรหัส JavaScript จาก MicrosoftAjax ไปยัง JQuery ฉันใช้ JavaScript เทียบเท่าใน MicrosoftAjax ของวิธี. net ที่เป็นที่นิยมเช่น String.format (), String.startsWith () เป็นต้นมีการเทียบเท่ากับ jQuery หรือไม่
ฉันพยายามย้ายรหัส JavaScript จาก MicrosoftAjax ไปยัง JQuery ฉันใช้ JavaScript เทียบเท่าใน MicrosoftAjax ของวิธี. net ที่เป็นที่นิยมเช่น String.format (), String.startsWith () เป็นต้นมีการเทียบเท่ากับ jQuery หรือไม่
คำตอบ:
รหัสที่มาสำหรับ ASP.NET AJAX สามารถใช้ได้สำหรับการอ้างอิงของคุณเพื่อให้คุณสามารถเลือกผ่านมันและรวมถึงชิ้นส่วนที่คุณต้องการใช้เป็นไฟล์ JS แยกต่างหาก หรือคุณสามารถย้ายพอร์ตเหล่านี้ไปยัง jQuery
นี่คือฟังก์ชั่นการจัดรูปแบบ ...
String.format = function() {
var s = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
var reg = new RegExp("\\{" + i + "\\}", "gm");
s = s.replace(reg, arguments[i + 1]);
}
return s;
}
และนี่คือจุดจบที่มีและเริ่มต้นด้วยฟังก์ชั่นต้นแบบ ...
String.prototype.endsWith = function (suffix) {
return (this.substr(this.length - suffix.length) === suffix);
}
String.prototype.startsWith = function(prefix) {
return (this.substr(0, prefix.length) === prefix);
}
{0}{1}
, {0}
จะถูกแทนที่แรกและจากนั้นเกิดขึ้นทั้งหมด{1}
ทั้งในข้อความแล้วแทนและรูปแบบเดิมจะถูกแทนที่
นี่เป็นรูปแบบที่เปลี่ยนแปลงได้เร็วขึ้น / ง่ายขึ้น (และต้นแบบ) ของฟังก์ชันที่ Josh โพสต์:
String.prototype.format = String.prototype.f = function() {
var s = this,
i = arguments.length;
while (i--) {
s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
}
return s;
};
การใช้งาน:
'Added {0} by {1} to your collection'.f(title, artist)
'Your balance is {0} USD'.f(77.7)
ฉันจะใช้นี้มากว่าฉัน aliased มันเพียงแต่คุณยังสามารถใช้มากขึ้นอย่างละเอียดf
format
เช่น'Hello {0}!'.format(name)
ฟังก์ชันข้างต้นจำนวนมาก (ยกเว้น Julian Jelfs) มีข้อผิดพลาดดังต่อไปนี้:
js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo
หรือสำหรับตัวแปรที่นับถอยหลังจากตอนท้ายของรายการอาร์กิวเมนต์:
js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo
นี่คือฟังก์ชั่นที่ถูกต้อง มันเป็นตัวแปรต้นแบบของรหัสของ Julian Jelfs ซึ่งฉันได้กระชับขึ้น:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};
และนี่คือเวอร์ชั่นขั้นสูงที่เหมือนกันเล็กน้อยซึ่งช่วยให้คุณสามารถหลบเลี่ยงวงเล็บปีกกาได้โดยเพิ่มพวกเขาเป็นสองเท่า:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return args[n];
});
};
วิธีนี้ทำงานอย่างถูกต้อง:
js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo
นี่คือการใช้งานที่ดีอีกอย่างหนึ่งโดย Blair Mitchelmore ด้วยคุณสมบัติพิเศษมากมาย: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format
ทำฟังก์ชั่นรูปแบบที่ใช้ทั้งคอลเลกชันหรืออาร์เรย์เป็นอาร์กิวเมนต์
การใช้งาน:
format("i can speak {language} since i was {age}",{language:'javascript',age:10});
format("i can speak {0} since i was {1}",'javascript',10});
รหัส:
var format = function (str, col) {
col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1);
return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return col[n];
});
};
String.prototype
?
หากคุณใช้ปลั๊กอินตรวจสอบความถูกต้องคุณสามารถใช้:
jQuery.validator.format("{0} {1}", "cool", "formatting") = 'cool formatting'
http://docs.jquery.com/Plugins/Validation/jQuery.validator.format#templateargumentargumentN ...
แม้ว่าจะไม่ใช่สิ่งที่ถามถามอย่างแน่นอน แต่ฉันได้สร้างสิ่งที่คล้ายกัน แต่ใช้ตัวยึดที่มีชื่อแทนหมายเลข โดยส่วนตัวแล้วฉันชอบการตั้งชื่อการโต้เถียงและส่งวัตถุเป็นอาร์กิวเมนต์ (โดยละเอียดมากกว่า แต่ง่ายต่อการดูแล)
String.prototype.format = function (args) {
var newStr = this;
for (var key in args) {
newStr = newStr.replace('{' + key + '}', args[key]);
}
return newStr;
}
นี่คือตัวอย่างการใช้งาน ...
alert("Hello {name}".format({ name: 'World' }));
คำตอบที่นำเสนอยังไม่มีการเพิ่มประสิทธิภาพที่ชัดเจนของการใช้กล่องหุ้มเพื่อเริ่มต้นครั้งเดียวและเก็บการแสดงออกปกติสำหรับประเพณีที่ตามมา
// DBJ.ORG string.format function
// usage: "{0} means 'zero'".format("nula")
// returns: "nula means 'zero'"
// place holders must be in a range 0-99.
// if no argument given for the placeholder,
// no replacement will be done, so
// "oops {99}".format("!")
// returns the input
// same placeholders will be all replaced
// with the same argument :
// "oops {0}{0}".format("!","?")
// returns "oops !!"
//
if ("function" != typeof "".format)
// add format() if one does not exist already
String.prototype.format = (function() {
var rx1 = /\{(\d|\d\d)\}/g, rx2 = /\d+/ ;
return function() {
var args = arguments;
return this.replace(rx1, function($0) {
var idx = 1 * $0.match(rx2)[0];
return args[idx] !== undefined ? args[idx] : (args[idx] === "" ? "" : $0);
});
}
}());
alert("{0},{0},{{0}}!".format("{X}"));
นอกจากนี้ยังไม่มีตัวอย่างการใช้งานรูปแบบ () หากมีอยู่แล้ว
นี่คือของฉัน:
String.format = function(tokenised){
var args = arguments;
return tokenised.replace(/{[0-9]}/g, function(matched){
matched = matched.replace(/[{}]/g, "");
return args[parseInt(matched)+1];
});
}
ไม่ใช่สัญลักษณ์แสดงหัวข้อย่อย แต่ทำงานได้ถ้าคุณใช้อย่างสมเหตุสมผล
ผ่านพ้นช่วงปลายฤดูไปแล้ว แต่ฉันเพิ่งดูคำตอบที่ได้รับและมีค่าความน่าเชื่อถือ:
การใช้งาน:
var one = strFormat('"{0}" is not {1}', 'aalert', 'defined');
var two = strFormat('{0} {0} {1} {2}', 3.14, 'a{2}bc', 'foo');
วิธี:
function strFormat() {
var args = Array.prototype.slice.call(arguments, 1);
return arguments[0].replace(/\{(\d+)\}/g, function (match, index) {
return args[index];
});
}
ผลลัพธ์:
"aalert" is not defined
3.14 3.14 a{2}bc foo
ตอนนี้คุณสามารถใช้ตัวอักษรเทมเพลต :
var w = "the Word";
var num1 = 2;
var num2 = 3;
var long_multiline_string = `This is very long
multiline templete string. Putting somthing here:
${w}
I can even use expresion interpolation:
Two add three = ${num1 + num2}
or use Tagged template literals
You need to enclose string with the back-tick (\` \`)`;
console.log(long_multiline_string);
นี่คือเวอร์ชั่นของฉันที่สามารถหลบหนี '{' และทำความสะอาดผู้ถือที่ไม่ได้รับมอบหมาย
function getStringFormatPlaceHolderRegEx(placeHolderIndex) {
return new RegExp('({)?\\{' + placeHolderIndex + '\\}(?!})', 'gm')
}
function cleanStringFormatResult(txt) {
if (txt == null) return "";
return txt.replace(getStringFormatPlaceHolderRegEx("\\d+"), "");
}
String.prototype.format = function () {
var txt = this.toString();
for (var i = 0; i < arguments.length; i++) {
var exp = getStringFormatPlaceHolderRegEx(i);
txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i]));
}
return cleanStringFormatResult(txt);
}
String.format = function () {
var s = arguments[0];
if (s == null) return "";
for (var i = 0; i < arguments.length - 1; i++) {
var reg = getStringFormatPlaceHolderRegEx(i);
s = s.replace(reg, (arguments[i + 1] == null ? "" : arguments[i + 1]));
}
return cleanStringFormatResult(s);
}
คำตอบต่อไปนี้น่าจะมีประสิทธิภาพมากที่สุด แต่มีข้อแม้ที่เหมาะสมสำหรับการโต้แย้ง 1 ถึง 1 ครั้งเท่านั้น วิธีนี้ใช้วิธีเชื่อมสตริงที่เร็วที่สุด (คล้ายกับ stringbuilder: array ของสตริงเข้าร่วม) นี่คือรหัสของฉันเอง อาจต้องมีตัวคั่นที่ดีกว่า
String.format = function(str, args)
{
var t = str.split('~');
var sb = [t[0]];
for(var i = 0; i < args.length; i++){
sb.push(args[i]);
sb.push(t[i+1]);
}
return sb.join("");
}
ใช้มันเหมือน:
alert(String.format("<a href='~'>~</a>", ["one", "two"]));
สิ่งนี้ละเมิดหลักการของ DRY แต่เป็นวิธีแก้ปัญหาที่กระชับ:
var button = '<a href="{link}" class="btn">{text}</a>';
button = button.replace('{text}','Authorize on GitHub').replace('{link}', authorizeUrl);
<html>
<body>
<script type="text/javascript">
var str="http://xyz.html?ID={0}&TId={1}&STId={2}&RId={3},14,480,3,38";
document.write(FormatString(str));
function FormatString(str) {
var args = str.split(',');
for (var i = 0; i < args.length; i++) {
var reg = new RegExp("\\{" + i + "\\}", "");
args[0]=args[0].replace(reg, args [i+1]);
}
return args[0];
}
</script>
</body>
</html>
ฉันไม่สามารถรับคำตอบของ Josh Stodola ให้ทำงานได้ แต่สิ่งต่อไปนี้เหมาะสำหรับฉัน prototype
หมายเหตุคุณสมบัติของ (ทดสอบบน IE, FF, Chrome และ Safari):
String.prototype.format = function() {
var s = this;
if(t.length - 1 != args.length){
alert("String.format(): Incorrect number of arguments");
}
for (var i = 0; i < arguments.length; i++) {
var reg = new RegExp("\\{" + i + "\\}", "gm");
s = s.replace(reg, arguments[i]);
}
return s;
}
s
จริงๆควรจะเป็นโคลนของthis
เพื่อที่จะไม่เป็นวิธีการทำลาย แต่ก็ไม่จำเป็นจริงๆ
การขยายคำตอบที่ดีของ adamJLev ด้านบนนี่เป็นเวอร์ชัน TypeScript:
// Extending String prototype
interface String {
format(...params: any[]): string;
}
// Variable number of params, mimicking C# params keyword
// params type is set to any so consumer can pass number
// or string, might be a better way to constraint types to
// string and number only using generic?
String.prototype.format = function (...params: any[]) {
var s = this,
i = params.length;
while (i--) {
s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), params[i]);
}
return s;
};
ฉันมีพลั่วเกอร์ที่เพิ่มลงในชุดต้นแบบสตริง: string.format มันไม่ได้สั้นแค่ตัวอย่างอื่น ๆ แต่มีความยืดหยุ่นมากกว่า
การใช้งานคล้ายกับรุ่น c #:
var str2 = "Meet you on {0}, ask for {1}";
var result2 = str2.format("Friday", "Suzy");
//result: Meet you on Friday, ask for Suzy
//NB: also accepts an array
นอกจากนี้ยังเพิ่มการสนับสนุนสำหรับการใช้ชื่อและคุณสมบัติของวัตถุ
var str1 = "Meet you on {day}, ask for {Person}";
var result1 = str1.format({day: "Thursday", person: "Frank"});
//result: Meet you on Thursday, ask for Frank
คุณสามารถปิดอาร์เรย์ด้วยการแทนที่เช่นนี้
var url = '/getElement/_/_/_'.replace(/_/g, (_ => this.ar[this.i++]).bind({ar: ["invoice", "id", 1337],i: 0}))
> '/getElement/invoice/id/1337
หรือคุณสามารถลอง bind
'/getElement/_/_/_'.replace(/_/g, (function(_) {return this.ar[this.i++];}).bind({ar: ["invoice", "id", 1337],i: 0}))