Javascript – Trimmfunktion auf jede Zeichenkette in einem Array anwenden

Willst du jede Saite in einem Array trimmen, zB gegeben

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

Ausgabe

  • Javascript-Aufruf () & apply () vs bind ()?
  • Warum ist das Argument einer Funktion kein Array in Javascript?
  • Warum funktioniert meine jQuery AJAX Funktion immer falsch?
  • Überschreiben von Argumentenobjekt für eine Javascript-Funktion
  • JQuery Verzögerung zwischen Animationen
  • Warum muss eine Funktion in jQuery in eine Methode eingewickelt werden?
  •  ['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?

  • Eine Abkürzung für Function.prototype.call.call?
  • Keine Funktion?
  • Kann kein Antwortformular facebook zu einer anderen Funktion übergeben
  • Kann den "Proxy-Objekt" nicht anwenden
  • Was macht das Ausrufezeichen vor der Funktion?
  • Der Zweck von "Self Invoking Anonymous Functions" [Duplizieren]
  • 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.