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