[英]Javascript: group JSON objects using specific key
I have the following JSON object and wanted to merge them by OrderID, making the items into array of objects: 我有以下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",
}
]
and I'm wondering how in Javascript to merge the items on the same order...like this: 而且我想知道如何在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"
}]
}]
I suggest you use javascript library like underscorejs/lazyjs/lodash to solve this kind of thing. 我建议您使用诸如underscorejs / lazyjs / lodash之类的javascript库来解决此类问题。
Here is the example on using underscorejs : 这是使用underscorejs的示例:
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();
Working example: 工作示例:
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>
Lodash is a great Javascript Utility library that can help you in this case. Lodash是一个很棒的Javascript Utility库,在这种情况下可以为您提供帮助。 Include the latest version of lodash in your code and group the objects like this: 在代码中包含lodash的最新版本,并按以下方式对对象进行分组:
var mergedOrders = _.groupBy(OriginalOrders, 'OrderID');
It seems you'll have to do a function that, for each entry, will check if it match 似乎您必须为每个条目执行一个函数,以检查它是否匹配
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]});
}
}
This should do what you want it to do, but it's rather a group function than a merge function :) 这应该做您想要的事情,但是它是一个组函数而不是合并函数:)
You can see the result in the browser console. 您可以在浏览器控制台中查看结果。
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>
You need to loop and create new grouped objects according to your requirement. 您需要根据需要循环并创建新的分组对象。
For an easier approach I would suggest using jquery-linq 为了更简单的方法,我建议使用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();
Thank you for all your answers. 感谢您的所有答复。
I was able to attain my goal (maybe a bit dirty and not as beautiful as yours but it worked on my end). 我能够实现自己的目标(也许有点肮脏,不如您的美丽,但最终成功了)。 Hoping this might help others in the future: 希望这会在将来对其他人有所帮助:
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;
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.