2017-01-03 9 views
1

これは基本的な質問ですが、私のPHPの背景は私がこれを解決できないようにしています。私もSOに近いソリューションを見つけることができませんでした。Javascript forループの配列を作成します。

ループと合計したい値を含むオブジェクトの配列があります。すべてうまくいきますが、出力内の別の配列にこれらの値を直接合計したいと思います。

だから、これは仕事関数である:

function postsCalc(arrayEntry) { 
     var postsOutput = []; 
     var postLikes = 0; 

     for (var i = 0, len = arrayEntry.length; i < len; i++) { 
      postLikes += arrayEntry[i].likes.summary.total_count; 
     } 

     postsOutput.likes = postLikes; 

     return postsOutput;  
    } 

出力:

likes : 55555; 

うまく動作しますが、私は配列のキーに直接プッシュしてpostsOutput.likes = postLikesを行うことを避けることができません?このよう

function postsCalc(arrayEntry) { 
     var postsOutput = []; 

     for (var i = 0, len = arrayEntry.length; i < len; i++) { 
      postsOutput.likes += arrayEntry[i].likes.summary.total_count; 
      // or even a multidimensional: 
      postsOutput.totals.likes += arrayEntry[i].likes.summary.total_count; 
     } 

     return postsOutput;  
    } 

とその出力上記と同じですが、余分なステップを避けるだろう、これはJavaScriptで可能ですか? (あなたの最初の機能のために)のようになりますジャバスクリプト事前

+1

phpには連想配列がありますが、javascript配列は非連想(キーのみではなく値を含む)です。キーが必要な場合は、オブジェクトについてのことです(配列ではありません)。 – Dekel

答えて

1

することができます一覧でreduce機能を使用してください。

function postsCalc(arrayEntry) { 
    var postLikes = arrayEntry.reduce(function(a, b) {return a + b.likes.summary.total_count}, 0); 

    return {likes: postLikes};  
} 

このように動作します。Array.reduce(callback, initialValue)コールバック= function(a, b)ここで、aはアキュムレータです(例:合計を追跡するなど)、bは、リスト上で反復処理しているアイテムを表しています。 initialValueは、関数の開始点です(たとえば、最初の反復時)。

+0

これは魅力的なように機能し、非常にきれいな解決策です。私は、非常に興味深いと思われるので、リダクションについてもっと読むつもりです。ありがとう! – nunorbatista

+0

お寄せいただきありがとうございます。 Arrayプロトタイプメソッドは、一度それらのハングアップを取得すると非常に便利です。 – abigperson

1

慣用的で

ありがとう:

function postsCalc(arrayEntry) { 
    var postsOutput = { 
     postLikes: 0 
    }; 

    for (var i = 0, len = arrayEntry.length; i < len; i++) { 
     postsOutput.postLikes += arrayEntry[i].likes.summary.total_count; 
    } 

    return postsOutput;  
} 

か、今私たちがとることのできる.forEachが存在します。

function postsCalc(arrayEntry) { 
    var postsOutput = { 
     postLikes: 0 
    }; 

    arrayEntry.forEach(function(entry) { 
     postsOutput.postLikes += entry.likes.summary.total_count; 
    } 

    return postsOutput;  
} 
+0

あなたの例では、後で値を割り当てるために空のオブジェクトを作成しなければならず、それが回避しようとしています。容認された解決策は簡単ですが、あなたの助けを借りてください! – nunorbatista