2017-03-08 7 views
0

希望:オブジェクトの単一の配列をループし、それらのオブジェクトのキーに基づいてオブジェクトに割り当てるための複数の配列を最も簡潔かつ効率的な方法で構築します。二つのアプローチ:Javascript:値の配列を含むオブジェクトのオブジェクトの配列 - 最もパフォーマンスの良い方法ですか?

ワン:

const arrayOfObjectsToObjectOfArraysOfValues = items => { 
    const newArrayOne = [] 
    const newArrayTwo = [] 
    const newArrayThree = [] 

    items.forEach(({ value1, value2, value3 }) => { 
    newArrayOne.push(value1) 
    newArrayTwo.push(value2) 
    newArrayThree.push(value3) 
    }) 

    return { newArrayOne, newArrayTwo, newArrayThree } 
} 

2:

const arrayOfObjectsToObjectOfArraysOfValues = items => ({ 
    newArrayOne: items.map(({ value1 }) => value1), 
    newArrayTwo: items.map(({ value2 }) => value2), 
    newArrayThree: items.map(({ value3 }) => value3), 
}) 

編集(このオプションもあります):

const arrayOfObjectsToObjectOfArraysOfValues = items => { 
    return items.reduce((r, { value1, value2, value3 }, i) => { 
    r.newArrayOne[i] = value1; 
    r.newArrayTwo[i] = value2; 
    r.newArrayThree[i] = value3; 
    return r; 
    }, { newArrayOne: [], newArrayTwo: [], newArrayThree: [] }); 
} 

が明らかに二つ目は、より簡潔であるが、 1つだけが必要な3つのループを実行すると批判されることがあります。一方、最初のループサイクルでは3回の操作が行われます。重要な質問オプションは、「これは(またはもう少しエレガントな)オプションです(最も効果的です)」ですか?

+0

あなたはすでに答えを知っていますか? 1ループ対3ループです。そして最も性能の良い方法は 'for'ループです。 – estus

+0

私はおそらく '.push'は高価な操作(ループごとにもっと多くの操作)をする可能性があると考えました... – Dan

+2

あなたは間違いなくパフォーマンスを測定する必要があります。あなたのターゲットを絞ったjavascriptエンジンのjsperf。 estusが反復ループ対応関数よりも遅い関数型関数を参照すると述べたのを除いて、ここでのパフォーマンスに関する明白な答えはありません。 –

答えて

0

私は私の初めてjsperf時流に乗った...ここに答えは、それがクライアントに依存しているように見えます、[OK]を:

https://jsperf.com/arrayofobjectstoobjectofarraysofvalues/1

Firefoxのオプション1には23%遅くなります。 (832,000 ops /秒のベースライン)
Chromeのオプション2は88%遅くなります。 (ベースライン秒当たり248,000 ops)
Safariオプション2では48%遅くなります。 (158,000 ops /秒のベースライン)

編集:reduceオプションはChromeで2%遅い& Safariでは、Firefoxでは50%遅くなります。

おそらくはい、ほとんどの場合、オプション1が良いでしょう。簡潔さへの同情...また、Firefoxに行く - とても速い!

最後に、オプション1は、reduceを使用して少しコンシサーになることができます。

関連する問題