سؤال

أحاول نقل بعض أكواد JavaScript البرمجية من MicrosoftAjax إلى JQuery.أستخدم مرادفات JavaScript في MicrosoftAjax لطرق .net الشائعة، على سبيل المثال.String.format()، String.startsWith()، إلخ.هل هناك ما يعادلها في jQuery؟

هل كانت مفيدة؟

المحلول

في شفرة المصدر لASP.NET AJAX هو متاحة للرجوع اليها، لذلك يمكنك أن تأخذ من خلال ذلك، وتشمل الأجزاء التي تريد الاستمرار في استخدام في ملف JS منفصل. أو، يمكنك ميناء لهم مسج.

وهنا هي وظيفة الشكل ...

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;
}

وهنا هي وظائف النموذج endsWith وstartsWith ...

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);
}

نصائح أخرى

وهذا هو أسرع / أسهل (وتنميط) الاختلاف الدالة التي نشرت جوش:

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) 

وأنا استخدم هذا كثيرا لدرجة أنني مستعارة لf فقط، ولكن يمكنك أيضا استخدام format أكثر مطول. مثلا 'Hello {0}!'.format(name)

والعديد من المهام المذكورة أعلاه (باستثناء جوليان 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

إليك وظيفة الصحيحة. انها البديل نموذجي من التعليمات البرمجية جوليان 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

وهنا هو تنفيذ آخر جيد بلير Mitchelmore، مع مجموعة من ميزات اضافية لطيفة: <لأ href = "https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string .format "يختلط =" noreferrer "> 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];
    });
};

هناك خيار رسمي (إلى حد ما): jQuery.validator.format.

يأتي مع jQuery Validation Plugin 1.6 (على الأقل).
مشابهة تماما ل String.Format وجدت في .NET.

يحرر تم إصلاح الرابط المكسور.

إذا كنت تستخدم البرنامج المساعد التحقق من صحة يمكنك استخدامها:

وjQuery.validator.format("{0} {1}", "cool", "formatting") = 'cool formatting'

http://docs.jquery.com/Plugins/Validation/jQuery.validator.format #templateargumentargumentN ...

وعلى الرغم من عدم بالضبط ما Q كان يسأل عن واحد، لقد بنيت مشابه ولكن يستخدم النائبة بدلا من مرقمة اسمه. أنا شخصيا أفضل وجود الوسائط المسماة وارسال فقط في كائن كحجة لذلك (أكثر مطول، ولكن أسهل للحفاظ على).

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}"));

وأيضا، فإن أيا من الأمثلة يحترم شكل التنفيذ () إذا كان موجودا بالفعل.

باستخدام متصفح حديث يدعم EcmaScript 2015 (ES6)، يمكنك الاستمتاع سلاسل القالب.بدلاً من التنسيق، يمكنك إدخال قيمة المتغير فيه مباشرة:

var name = "Waleed";
var message = `Hello ${name}!`;

لاحظ أنه يجب كتابة سلسلة القالب باستخدام علامات التجزئة الخلفية (`).

وهنا الألغام:

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 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);

والطريق الماضي الموسم الماضي ولكن لقد كنت أبحث فقط في الإجابات ويكون لي tuppence قيمتها:

والاستعمال:

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

إليك نسختي أن يكون قادرا على الهرب '{'، وتنظيف تلك حاملي مكان غير مخصص.

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: مجموعة من الجمل، وانضم). هذا هو رمز بلدي. ربما يحتاج فاصل أفضل بالرغم من ذلك.

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"]));

وهذا يخالف مبدأ جاف، لكنه حل موجزة:

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>

لم أستطع الحصول على إجابة جوش Stodola في العمل، ولكن ما يلي عملت بالنسبة لي. ملاحظة مواصفات prototype. (اختبار على IE، FF، والكروم، وسفاري):

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 في ما سبق ، وهنا هو إصدار نسخة مطبوعة على الآلة الكاتبة:

// 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 فهي ليست مجرد قصيرة قدر بعض الأمثلة الأخرى، ولكن الكثير أكثر مرونة.

والاستخدام مشابه لج # نسخة:

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}))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top