使用javascript将对象数组展平为另一个对象数组

时间:2013-06-06 04:13:55

标签: javascript arrays design-patterns object

我在多种语境和语言中遇到了这个问题,我总是能够解决这个问题,但我想最终想出一个合适的模式来处理这个问题。它来自加入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
      }
    ]
  }
]

2 个答案:

答案 0 :(得分: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]} })
}

答案 1 :(得分: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;
        }
    });
}