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

Javascript: group JSON objects using specific key

本文关键字:对象 JSON Javascript      更新时间:2023-09-26

我有以下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"
    }]
}]

我建议你使用像underscorejs/lazyjs/lodash这样的javascript库来解决这种问题。

下面是使用下划线的例子:

var data = [{
    "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",
}]
var result = _.chain(data).groupBy(function (e) {
    return e.OrderID;
}).map(function (val, key) {
    return {
        OrderID: key,
        Items: _.map(val, function (eachItem) {
            delete eachItem.OrderID;
            return eachItem;
        })
    };
}).value();

工作的例子:

var data = [{
  "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",
}];
var result = _.chain(data).groupBy(function (e) {
  return e.OrderID;
}).map(function (val, key) {
  return {
    OrderID: key,
    Items: _.map(val, function (eachItem) {
      delete eachItem.OrderID;
      return eachItem;
    })
  };
}).value();
document.write(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

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

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

var items = [
  {
    "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",
  }
];
function groupBy(ungrouped, groupByProperty) {
  var result = [], 
      getGroup = function (arr, val, groupByProperty) {
        var result, j, jlen;
        for (j = 0, jlen = arr.length; j < jlen; j++) {
          if (arr[j][groupByProperty] === val) {
            result = arr[j];
            break;
          }
        }
        if (!result) {
          result = {};
          result.items = [];
          result[groupByProperty] = val;
          arr.push(result);
        }
        return result;
      }, i, len, item;
  for (i = 0, len = ungrouped.length; i < len; i++) {
    item = getGroup(result, ungrouped[i][groupByProperty], groupByProperty);
    delete ungrouped[i][groupByProperty];
    item.items.push(ungrouped[i]);
  }
  return result;
}
var grouped = groupBy(items, 'OrderID');
document.getElementById('result').innerHTML = JSON.stringify(grouped);
console.log(grouped);
<div id="result"></div>

Lodash是一个很棒的Javascript Utility库,可以帮助您解决这种情况。在代码中包含最新版本的lodash,并像这样对对象进行分组:

var mergedOrders = _.groupBy(OriginalOrders, 'OrderID');

似乎你必须做一个函数,对于每个条目,将检查它是否匹配

try this:

    // 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]});
    }
}

您需要根据您的需求循环并创建新的分组对象。

对于一个更简单的方法,我建议使用jquery-linq
var qOrderIds = $.Enumerable.From(myArray).Select(function(item) { return item.OrderID; }).Distinct();
var groupedList = qOrderIds.Select(function(orderId) { 
    return { 
         OrderID: orderId, 
         Items : $.Enumerable.From(myArray).Where(function(item) { item.OrderID === orderId}).ToArray()
    };
}).ToArray();

谢谢你的回答。

我能够达到我的目标(也许有点脏,没有你的漂亮,但它在我的结束工作)。希望这可能会帮助其他人在未来:

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;

}