6

我在多种上下文和语言中遇到了这个问题,我总是能够解决它,但我想最终找出一个合适的模式来处理这个问题。它来自连接 SQL 表。通常我会打两个电话,一个是项目,一个是评论,但我知道有一种方法可以在一个电话中获取所有内容,然后将结果展平。

我想做的是采用如下所示的数组:

[
  {
    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

您也可以使用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 回答
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 回答