91

たとえば、与えられた配列内の各文字列をトリムしたい

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

出力

['aa', 'bb']

私の最初の試練は

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

クロムで「TypeError:Function.prototype.applyが未定義で呼び出されました。これは未定義であり、関数ではありません」。

それから私は試しました

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

できます。違いは何ですか?

4

12 に答える 12

130

または、これは矢印関数で解決できます。

x.map(s => s.trim());
于 2016-12-16T11:41:58.060 に答える
105

String.prototype.trim.applyにバインドされていないFunction.prototype.applyメソッドtrimです。map文字列、インデックス、配列を引数として呼び出し、 Argundefinedには ( ) を指定しませんが、関数で呼び出されることを期待しています。thisapply

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

あなたができることは、trim関数をコンテキストとして渡すことですcall

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

ここで起こることは

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
于 2013-10-10T11:25:11.100 に答える
32

依存関係のない単純なバリアント:

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

ES6 バリアント:

const newArray = oldArray.map(string => string.trim())

ES6 関数バリアント:

const trimmedArray = array => array.map(string => string.trim())
于 2015-10-14T10:09:18.963 に答える
16

まず、簡単に実行します:

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

次に、最初のものが機能しない理由は、文字列がコンテキストとしてではなく、引数としてコールバックに渡されるためです。に引数を渡さないapplyので、同じメッセージが表示されます。

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

さて、お楽しみとして、コールバックをこのように使用することに満足mapできず、引数ではなくコンテキストを使用して関数を渡したいとします。

次に、これを行うことができます:

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

所有していないオブジェクト (ここでは Array のプロトタイプ) を変更することは、悪い習慣と広く見なされているため、「主に楽しみのために」と言いました。ただし、配列とコールバックの両方を引数として取る実用的な関数を作成することもできます。

于 2013-10-10T11:03:07.923 に答える
5

最短かつ最速の方法を得るために、文字列の配列をトリミングするいくつかの方法を比較しました。興味のある方は、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);

注:jQueryは、文字数とタイプを比較するためのものです;)

于 2015-11-08T14:20:30.137 に答える
1
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"]

主要なブラウザはすべてをサポートしていますが、 がサポートするのはバージョン 9 以降であることにforEach()注意してください。IE

于 2016-09-25T10:12:28.730 に答える