2013-06-06 18 views
6

私はこの問題を複数のコンテキストや言語で扱ってきましたが、いつもそれを回避することができましたが、これを対応して。これはSQLテーブルの結合から来ています。通常、私は2つのコールを行います.1つはアイテム用、もう1つはコメント用ですが、1回の呼び出しですべてを取得して結果を平坦化する方法があります。javascriptを使ってオブジェクトの配列を別の配列にまとめる

[ 
    { 
    itemId: 1, 
    comments: { 
     commentId: 1 
    } 
    }, 
    { 
    itemId: 1, 
    comments: { 
     commentId: 2 
    } 
    }, 
    { 
    itemId: 2, 
    comments: { 
     commentId: 3 
    } 
    } 
] 

をそして、これにそれを回す:私がやりたいのは何

は、次のようになります配列を取ることです

[ 
    { 
    itemId: 1, 
    comments: [ 
     { 
     commentId: 1 
     }, 
     { 
     commentId: 2 
     } 
    ] 
    }, 
    { 
    itemId: 2, 
    comments: [ 
     { 
     commentId: 3 
     } 
    ] 
    } 
] 
+0

投稿時刻: – akonsu

答えて

1

あなたのために働く必要があり、次

function combine(arr) { 
    var newObj = {}; 

    // combine the comments 
    for (var i=0; i < arr.length; i++) { 
     if (newObj[arr[i].itemId]) { 
      newObj[arr[i].itemId].push(arr[i].comments); 
     } else { 
      newObj[arr[i].itemId] = [arr[i].comments]; 
     } 
    } 

    // make the list 
    var keys = Object.keys(newObj); 
    return keys.map(function(key){return {itemId: key, comments: newObj[key]} }) 
} 
+0

'Object.keys'の順番は明確ではなく、誤って要素の順序を変更する可能性があることに注意してください。 –

+0

また、 'Object.keys'はIEには存在しません。追加する必要があります(es5shim) –

+1

また、すでにES5を使用しているので、最後のステップでは' Array#map'が好きかもしれません。少し読めます;-) –

1

また、あなたはfilter()を使用することができます。

function combine(src) { 
    var dict = {}; 
    return src.filter(function(item) { 
     if (!dict[item.itemId]) { 
      item.comments = [ item.comments ]; 
      dict[item.itemId] = item; 
      return true; 
     } else { 
      dict[item.itemId].comments.push(item.comments); 
      return false; 
     } 
    }); 
} 
関連する問題