javascript - Motsvarighet till String.format i jQuery


Jag försöker flytta viss JavaScript-kod från MicrosoftAjax till jQuery. Jag använder motsvarigheterna i MicrosoftAjax av de populära .NET-metoderna, t.ex. String.format(), String.startsWith() osv. Finns det motsvarigheter till dem i jQuery?

Svar #1

Källkoden för ASP.NET AJAX är tillgänglig för din referens, så du kan gå igenom den och inkludera de delar du vill fortsätta använda i en separat JS-fil. Eller så kan du överföra dem till jQuery.

Här är formatfunktionen...

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

Och här är prototype-funktionerna endsWith och 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);
}

Svar #2

Detta är en snabbare/enklare (och prototypisk) variant av funktionen som Josh postade:

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

Användning :

'Added {0} by {1} to your collection'.f(title, artist)
'Your balance is {0} USD'.f(77.7) 

Jag använder detta så mycket att jag gav det aliaset f, men du kan också använda det mer omfattande format. t.ex. 'Hello {0}!'.format(name)

Svar #3

Många av ovanstående funktioner (förutom Julian Jelfs's) innehåller följande fel:

js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo

Eller, för de varianter som räknar bakåt från slutet av argumentlistan:

js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo

Här är en korrekt funktion. Det är en prototypbaserad variant av Julian Jelfs kod, som jag gjorde lite mer stram:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};

Och här är en något mer avancerad version av samma sak, som låter dig undkomma klamrar genom att dubbla dem:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
    if (m == "{{") { return "{"; }
    if (m == "}}") { return "}"; }
    return args[n];
  });
};

Detta fungerar korrekt:

js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo

Här är en annan bra implementation av Blair Mitchelmore, med en massa fina extra funktioner: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format

Svar #4

Skapade en formatfunktion som tar antingen en samling eller en array som argument

Användning :

format("i can speak {language} since i was {age}",{language:'javascript',age:10});

format("i can speak {0} since i was {1}",'javascript',10});

Kod :

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

Svar #5

Det finns ett (något) officiellt alternativ: jQuery.validator.format.

Levereras med jQuery Validation Plugin 1.6 (åtminstone).
Ganska lik String.Format som finns i .NET.

Redigera Fixade trasig länk.

Svar #6

Om du använder valideringspluginet kan du använda:

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

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

Svar #7

Även om det inte är exakt vad Q frågade efter, har jag byggt en som är liknande men använder namngivna platshållare istället för numrerade. Jag föredrar personligen att ha namngivna argument och bara skicka in ett objekt som argument till den (mer utförligt, men lättare att underhålla).

String.prototype.format = function (args) {
    var newStr = this;
    for (var key in args) {
        newStr = newStr.replace('{' + key + '}', args[key]);
    }
    return newStr;
}

Här är ett exempel på användning...

alert("Hello {name}".format({ name: 'World' }));

Svar #8

Med en modern webbläsare som stödjer EcmaScript 2015 (ES6) kan du njuta av Template Strings. Istället för formatering kan du direkt infoga variabelns värde i den:

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

Observera att mallsträngen måste skrivas med backticks (`).

Relaterade artiklar