としてはすでにここ数回を述べ、これを実行する最も簡単な方法は、
function intercalate(glue, arr){
return arr.reduce((acc, v) => acc.concat(glue, v));
}
ですが、それはすべての繰り返しAで作成されますので、これは、最善の方法ではありません新しい(中間の)配列は、次に破棄されます。この短い値の配列ではこれは重要ではありませんが、もっと長い配列でこれを使うつもりならば、その影響に気付くかもしれません。
ベター
function intercalate(glue, arr){
const push = (acc, v) => (Array.isArray(v)? acc.push(...v): acc.push(v), acc);
return arr.reduce((acc, v, i) => push(i===0? acc: push(acc, glue), v), []);
}
。彼らが来るよう、1つのアレイを作成し、そのに値をプッシュするだろう。しかし、この配列が徐々に増加しているので、それはまだ大きなメモリの塊とコピーを割り当てる必要があるかもしれませんデータ。これらのタスクは非常にパフォーマンスが良いが、依然として不要です(imo)。私たちはより良くすることができます。
まず、すべての配列と区切り文字を含むリストを作成し、concat.apply([], list)
を使用してこれを平坦化します。したがって、私たちは事前に計算できるサイズの1つの中間配列を生成し、残りはArray.concatの問題であり、基本実装です。それが渡された値に依存してもよいし、天気をかJITコンパイラがSを最適化するので
function intersperse(delimiter, arr){
if(!arr.length) return [];
let j = 0, push = (acc, v) => (acc[j++] = v, acc);
return arr.reduce((acc, v) => push(j===0? acc: push(delimiter, glue), v), Array(2*arr.length-1));
}
//or
function intersperse(delimiter, arr){
if(!arr.length) return [];
var out = Array(2*arr.length-1);
out[0] = arr[0];
for(var i=1, j=1; j<out.length;){
out[j++] = delimiter;
out[j++] = arr[i++];
}
return out;
}
//and
function intercalate(glue, arr){
var emptyArray = [];
return arr.length?
emptyArray.concat.apply(emptyArray, intersperse(glue, arr)):
emptyArray;
}
WICHのバージョンが最速/最高となり、最終的には、言うことそれは容易ではありません***アウトそれの。私はポイントを作った、それはあなたが使用するバージョン/実装を選択するのはあなた次第です。
最初のバージョンに:あなたは全くのlibにこれを入れないことを好むが、ほとんどインラインをそれを書くことが(それは短く、そのために十分に簡単です)、したがって、JITコンパイラは、いくつかを見つけるためにしようとしないかもしれません異なるコールの共通タイプ(#monomorphic function/code)となり、したがって、それぞれの発生を別々に最適化します。一方、これは時期尚早の最適化である可能性があります。それはあなた次第です。
さらにいくつかの例を追加してください。 –
目的の機能名は、配列を別の要素で[intersperse](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:intersperse)することです。現在、Lodashのための[機能リクエスト](https://github.com/lodash/lodash/issues/2339)ですので、ライブラリに追加したいのであれば、アップアップしてください! – 4castle
@ 4castle Oh cool。多分私はプルリクエストを提出するでしょう。ありがとうございました!! – GregRos