2017-12-16 5 views
2

pop()/shift()slice()よりもはるかに優れています。そう、これはよりパフォーマンスする必要があります元の配列を返すpop()/ shift()メソッド

proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) { 
    const self = this; 
    return function (err: IPseudoError) { 
    if (err) { 
     return self.__handle(err, false); 
    } 
    try { 
     // remove the error-first argument 
     return fn.apply(this, Array.from(arguments).slice(1)); 
    } 
    catch (err) { 
     return self.__handle(err, false); 
    } 
    } 
}; 

https://jsperf.com/pop-vs-slice/5

はここで)(スライスを使用して、私のユースケースだ

proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) { 
     const self = this; 
     return function (err: IPseudoError) { 
     if (err) { 
      return self.__handle(err, false); 
     } 
     try { 
      const args = Array.from(arguments); 
      args.shift() 
      return fn.apply(this, args); 
     } 
     catch (err) { 
      return self.__handle(err, false); 
     } 
     } 
    }; 

が、少ないコードでそれを行う方法がある場合、私は疑問に思っておそらくArray.from(引数)を呼び出さなくてもそれを行う方法でしょうか?

多分何かこのようなちょっとクレイジー

delete arguments[0]; 
return fn.apply(this, arguments); 
+0

はい私は最後のアイデア(deleteを使用)が動作するとは思わない –

+1

代わりにrestパラメータを使用できますか? "function(err:IPseudoError、... args){' – 4castle

+0

@ 4castle私の質問は明らかではありませんが、最初の引数を引数 "array"からシフトして引数を適用する最もパフォーマンスの良い方法を探しています別の機能 –

答えて

2

引数から任意の方法で新しい配列を作成しますが、最初の要素もスキップします。 sliceメソッドをArray.prototypeからargumentsに送信することで、最も効果的な方法が使用されます。したがって、最初のケースのように一時配列を作成してスライスする必要はなく、2番目のケースのように最初の要素を削除する必要はありません。

proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) { 
    const self = this; 
    return function (err: IPseudoError) { 
    if (err) { 
     return self.__handle(err, false); 
    } 
    try { 
     const args = Array.prototype.slice.call(arguments, 1); 
     return fn.apply(this, args); 
    } 
    catch (err) { 
     return self.__handle(err, false); 
    } 
    } 
}; 
+0

これは最高のオプションのようです –

2

ポップ/ Shiftキーを使用して、スプライスまたはスライスを使用することができ、高速な方法ですが、ポップ/シフトはクロームでLESTに高速である、削除がために適切ではありません配列See more hereの要素を削除します。

+2

実際に問題になっているベンチマークは 'pop'が最速であることを示しています。 – alfasin

+0

ええ、私は 'shift()'が必要ではなく、 'pop()'が必要です。 –

関連する問題