Javascript – Trimmfunktion auf jede Zeichenkette in einem Array anwenden

Willst du jede Saite in einem Array trimmen, zB gegeben

x = [' aa ', ' bb ']; 

Ausgabe

  • Aufruf einer jQuery-Funktion, die in einer Variablen benannt ist
  • Wie kann ich bei der Verwendung von .execute () weitere Argumente an Callback-Funktionen in Javascript übergeben?
  • Wie kann JavaScript neue Seite erstellen, die mehr JavaScript enthält?
  • Unterschied zwischen parseInt () und parseFloat ()
  • Javascript: Wie passiert gefunden string.replace Wert zu funktionieren?
  • () Funktioniert nicht in allen Browsern
  •  ['aa', 'bb'] 

    Mein erster Versuch ist

     x.map(String.prototype.trim.apply) 

    Es wurde "TypeError: Function.prototype.apply wurde auf undefined aufgerufen, was eine undefinierte und nicht eine Funktion" in Chrom ist.

    Dann habe ich versucht

     x.map(function(s) { return String.prototype.trim.apply(s); }); 

    Es klappt. Was ist der Unterschied?

  • Javascript neues Objekt (Funktion) vs Inline-Aufruf
  • Senden von Daten an parse.com und aktualisieren winkligen $ scope
  • Immer noch Probleme beim Zurückgeben von Wert durch Funktion
  • Javascript-Objekte weisen der Eigenschaft zu
  • JQuery-Funktion bindet auf 'input propertychange' nicht abfeuern wie erwartet
  • Wie kann ich eine Funktion zu json Objekt hinzufügen, das __type Attribut hat?
  • 8 Solutions collect form web for “Javascript – Trimmfunktion auf jede Zeichenkette in einem Array anwenden”

    String.prototype.trim.apply ist die Function.prototype.apply , ohne dass sie sich trim . map wird es mit der Zeichenfolge, dem Index und dem Array als Argumente aufrufen und nichts ( undefined ) für this Arg – aber es apply erwartet, dass sie aufgerufen werden soll:

     var apply = String.prototype.trim.apply; apply.call(undefined, x[0], 0, x) // TypeError 

    Was Sie tun können, ist die Übergabe der trim als Kontext für den call :

     [' aa ', ' bb '].map(Function.prototype.call, String.prototype.trim) // ['aa', 'bb'] 

    Was passiert hier ist

     var call = Function.prototype.call, trim = String.prototype.trim; call.call(trim, x[0], 0, x) ≡ trim.call(x[0], 0, x) ≡ x[0].trim(0, x); // the arguments don't matter to trim 

    Wenn du JQuery benutzt hast, dann ist es ein besserer Weg, dies zu tun, da es auch mit IE8 funktionieren wird (ich muss IE8 unterstützen) ist das:

     $.map([' aa ', ' bb ', ' cc '], $.trim); 

    Zuerst tu es einfach:

     x.map(function(s) { return s.trim() }); 

    Dann ist der Grund, warum der erste nicht funktioniert, dass der String als Argument an den Rückruf übergeben wird, nicht als Kontext. Wenn Sie kein Argument apply , erhalten Sie die gleiche Nachricht, die Sie mit haben würden

     var f = String.prototype.trim.apply; f.call(); 

    Nun, meistens zum Spaß, nehmen wir an, Sie sind nicht glücklich mit der Tatsache, dass map den Rückruf auf diese Weise und Sie möchten in der Lage sein, eine Funktion über den Kontext, nicht das Argument zu übergeben.

    Dann könntest du das tun:

     Object.defineProperty(Array.prototype, "maprec", { value: function(cb){ return this.map(function(v){ return cb.call(v) }) } }); console.log([' aa ', ' bb '].maprec(String.prototype.trim)); // logs ["aa", "bb"] 

    Ich sagte "meistens zum Spaß", weil das Ändern von Objekten, die Sie nicht besitzen (Arrays Prototyp hier), weithin als eine schlechte Praxis gesehen wird. Aber du könntest auch eine utilitaristische Funktion machen, die sowohl das Array als auch den Rückruf als Argumente macht.

    Die einfache Variante ohne Abhängigkeiten:

      for (var i = 0; i < array.length; i++) { array[i] = array[i].trim(); } 

    ES6 Variante:

     const newArray = oldArray.map(string => { return string.trim() }) 

    ES6 Funktionsvariante:

     const trimArray = array => { return array.map(string => { return string.trim() }) } 

    Oder das kann mit Pfeilfunktionen gelöst werden:

     x.map(s => s.trim()); 

    Ich habe nur einige Möglichkeiten, um eine Reihe von Strings, um die kürzeste und schnellste Methode zu trimmen. Wer interessiert ist, hier ist ein Performance-Test auf jsperf: http://jsperf.com/trim-array-of-strings

     var chunks = " .root , .parent > .child ".split(',') var trimmed1 = chunks.map(Function.prototype.call, String.prototype.trim); var trimmed2 = chunks.map(function (str) { return str.trim(); }); var trimmed3 = chunks.map(str => str.trim()); var trimmed4 = $.map(chunks, $.trim); 

    Hinweis: jQuery ist nur hier, um die Anzahl der Zeichen zu tippen;)

    Beeinflussen von Bergis perfekter Antwort, möchte ich nur hinzufügen, für die Methoden, die nicht this Argument nehmen, können Sie die gleiche Arbeit wie folgt erreichen;

     var x = [' aa ', ' bb '], y = x.map(Function.prototype.call.bind(String.prototype.trim)) 
     var x = [" aa ", " bb "]; console.log(x); // => [" aa ", " bb "] // remove whitespaces from both sides of each value in the array x.forEach(function(value, index){ x[index] = value.trim(); }); console.log(x); // => ["aa", "bb"] 

    Alle großen Browser unterstützen forEach() , aber beachten Sie, dass IE es nur ab Version 9 unterstützt.

    Lassen Sie uns Javascript Schönheit und nützlich machen.