Javascript:使用特定键对JSON对象进行分组

Javascript:使用特定键对JSON对象进行分组,javascript,json,Javascript,Json,我有以下JSON对象,并希望通过OrderID将它们合并,使项目成为对象数组: [ { "OrderID":"999123", "ItemCode":"TED-072", "ItemQuantity":"1", "ItemPrice":"74.95", }, { "OrderID":"999123", "ItemCode":"DY-FBBO", "ItemQuantity":"2", "ItemName":"DOIY F

我有以下JSON对象,并希望通过OrderID将它们合并,使项目成为对象数组:

[
  {
    "OrderID":"999123",
    "ItemCode":"TED-072",
    "ItemQuantity":"1",
    "ItemPrice":"74.95",
  },
  {
    "OrderID":"999123",
    "ItemCode":"DY-FBBO",
    "ItemQuantity":"2",
    "ItemName":"DOIY Foosball Bottle Opener > Red",
    "ItemPrice":"34.95",
  }
]
我想知道如何在Javascript中以相同的顺序合并项目…如下所示:

[{
    "OrderID": "999123",
        "Items": [{
        "ItemCode": "DY-FBBO",
            "ItemQuantity": "2",
            "ItemName": "DOIY Foosball Bottle Opener > Red",
            "ItemPrice": "34.95"
    }, {
        "ItemCode": "TED-072",
            "ItemQuantity": "1",
            "ItemName": "Ted Baker Womens Manicure Set",
            "ItemPrice": "74.95"
    }]
}]
var mergedOrders = _.groupBy(OriginalOrders, 'OrderID');

Lodash是一个很棒的Javascript实用程序库,可以在这种情况下帮助您。在代码中包含lodash的最新版本,并按如下方式对对象进行分组:

[{
    "OrderID": "999123",
        "Items": [{
        "ItemCode": "DY-FBBO",
            "ItemQuantity": "2",
            "ItemName": "DOIY Foosball Bottle Opener > Red",
            "ItemPrice": "34.95"
    }, {
        "ItemCode": "TED-072",
            "ItemQuantity": "1",
            "ItemName": "Ted Baker Womens Manicure Set",
            "ItemPrice": "74.95"
    }]
}]
var mergedOrders = _.groupBy(OriginalOrders, 'OrderID');

似乎您必须为每个条目执行一个函数,该函数将检查它是否匹配

试试这个:

    // your array is oldArr
var newArr = []
for (var i=0;i<oldArr.length;i++){
    var found = false;
    for(var j=0;j<newArr.length;j++){
        if(oldArr[i]["OrderID"]==newArr[j]["OrderID"]){
            newArr[j]["Items"].push(oldArr[i]);
            found=true;
            break;
    }
    if(!found){
        newArr.push({"OrderID" : oldArr[i]["OrderID"], "Items" : oldArr[i]});
    }
}
//您的数组是oldArr
var newArr=[]

对于(var i=0;i,您需要根据需要循环并创建新的分组对象

对于更简单的方法,我建议使用


我建议您使用诸如下划线JS/lazyjs/lodash之类的javascript库来解决这类问题

以下是有关使用的示例:

工作示例:

var数据=[{
“订单ID”:“999123”,
“项目代码”:“TED-072”,
“项目数量”:“1”,
“项目价格”:“74.95”,
}, {
“订单ID”:“999123”,
“项目代码”:“DY-FBBO”,
“项目数量”:“2”,
“项目名称”:“DOIY Foosball开瓶器>红色”,
“项目价格”:“34.95”,
}];
var结果=u0.chain(数据).groupBy(函数(e){
返回e.OrderID;
}).map(功能(val,键){
返回{
OrderID:key,
项目:映射(val、函数(每个项目){
删除eachItem.OrderID;
归还每一张支票;
})
};
}).value();
document.write(JSON.stringify(result));

这应该做您希望它做的事情,但它更像是一个组函数,而不是一个合并函数:)

您可以在浏览器控制台中看到结果

var项目=[
{
“订单ID”:“999123”,
“项目代码”:“TED-072”,
“项目数量”:“1”,
“项目价格”:“74.95”,
},
{
“订单ID”:“999123”,
“项目代码”:“DY-FBBO”,
“项目数量”:“2”,
“项目名称”:“DOIY Foosball开瓶器>红色”,
“项目价格”:“34.95”,
}
];
函数groupBy(未分组,groupByProperty){
var结果=[],
getGroup=函数(arr、val、groupByProperty){
var结果,j,jlen;
对于(j=0,jlen=arr.length;j

谢谢您的回答

我能够实现我的目标(也许有点脏,也没有你的漂亮,但它在我这边起了作用)。希望这能在未来帮助其他人:

function processJsonObj2(dataObj, cfg) {
var retVal = dataObj.reduce(function(x, y, i, array) {

    if (x[cfg.colOrderId] === y[cfg.colOrderId]) {

        var orderId = x[cfg.colOrderId];
        var addressee = x[cfg.colAddressee];
        var company = x[cfg.colCompany];
        var addr1 = x[cfg.colAddress1];
        var addr2 = x[cfg.colAddress2];
        var suburb = x[cfg.colSuburb];
        var state = x[cfg.colState];
        var postcode = x[cfg.colPostcode];
        var country = x[cfg.colCountry];
        var orderMsg = x[cfg.colOrderMessage];
        var carrier = x[cfg.colCarrier];

        delete x[cfg.colOrderId];
        delete y[cfg.colOrderId];
        delete x[cfg.colAddressee];
        delete y[cfg.colAddressee];
        delete x[cfg.colCompany];
        delete y[cfg.colCompany];
        delete x[cfg.colAddress1];
        delete y[cfg.colAddress1];
        delete x[cfg.colAddress2];
        delete y[cfg.colAddress2];
        delete x[cfg.colSuburb];
        delete y[cfg.colSuburb];
        delete x[cfg.colState];
        delete y[cfg.colState];
        delete x[cfg.colPostcode];
        delete y[cfg.colPostcode];
        delete x[cfg.colCountry];
        delete y[cfg.colCountry];
        delete x[cfg.colOrderMessage];
        delete y[cfg.colOrderMessage];
        delete x[cfg.colCarrier];
        delete y[cfg.colCarrier];

        var orderObj = {};
        orderObj[cfg.colOrderId] = orderId;
        orderObj[cfg.colAddressee] = addressee;
        orderObj[cfg.colCompany] = company;
        orderObj[cfg.colAddress1] = addr1;
        orderObj[cfg.colAddress2] = addr2;
        orderObj[cfg.colSuburb] = suburb;
        orderObj[cfg.colState] = state;
        orderObj[cfg.colPostcode] = postcode;
        orderObj[cfg.colCountry] = country;
        orderObj[cfg.colOrderMessage] = orderMsg;
        orderObj[cfg.colCarrier] = carrier;
        orderObj["Items"] = [ x, y ];

        return orderObj;

    } else {
        var orderId = x[cfg.colOrderId];
        var addressee = x[cfg.colAddressee];
        var company = x[cfg.colCompany];
        var addr1 = x[cfg.colAddress1];
        var addr2 = x[cfg.colAddress2];
        var suburb = x[cfg.colSuburb];
        var state = x[cfg.colState];
        var postcode = x[cfg.colPostcode];
        var country = x[cfg.colCountry];
        var orderMsg = x[cfg.colOrderMessage];
        var carrier = x[cfg.colCarrier];

        var itemCode = x[cfg.colItemCode];
        var itemQuantity = x[cfg.colItemQuantity];
        var itemName = x[cfg.colItemName];
        var itemPrice = x[cfg.colitemPrice];

        var item = {};
        item[cfg.colItemCode] = itemCode;
        item[cfg.colItemQuantity] = itemQuantity;
        item[cfg.colItemName] = itemName;
        item[cfg.colItemPrice] = itemPrice;

        var orderObj = {};
        orderObj[cfg.colOrderId] = orderId;
        orderObj[cfg.colAddressee] = addressee;
        orderObj[cfg.colCompany] = company;
        orderObj[cfg.colAddress1] = addr1;
        orderObj[cfg.colAddress2] = addr2;
        orderObj[cfg.colSuburb] = suburb;
        orderObj[cfg.colState] = state;
        orderObj[cfg.colPostcode] = postcode;
        orderObj[cfg.colCountry] = country;
        orderObj[cfg.colOrderMessage] = orderMsg;
        orderObj[cfg.colCarrier] = carrier;
        orderObj["Items"] = [ item ];

        return orderObj;
    }

});

return retVal;

}

我想说,这是分组而不是合并,不是吗?我已经尝试过了,但没有取得什么进展:var result=[];对于(var j=0;jRed”,“项目价格”:“34.95”,}];