6

複数のコンテキストと言語でこの問題に遭遇し、常に回避できましたが、最終的にこれを処理する適切なパターンを見つけたいと思います。これは、SQL テーブルの結合に由来します。通常、アイテム用とコメント用の 2 つの呼び出しを行いますが、1 回の呼び出しですべてを取得し、結果を平坦化する方法があることはわかっています。

私がやりたいことは、次のような配列を取ることです:

[
  {
    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
      }
    ]
  }
]
4

2 に答える 2

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]} })
}
于 2013-06-06T04:20:24.280 に答える
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;
        }
    });
}
于 2013-06-06T04:55:41.440 に答える