Javascript 在JSON中对类似项进行分组
您好,我有一个以JSON形式返回的集合,如下所示:Javascript 在JSON中对类似项进行分组,javascript,laravel,Javascript,Laravel,您好,我有一个以JSON形式返回的集合,如下所示: [ { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1"
[
{
"quantity": "1",
"description": "VIP Ticket to Event"
},
{
"quantity": "1",
"description": "VIP Ticket to Event"
},
{
"quantity": "1",
"description": "VIP Ticket to Event"
},
{
"quantity": "1",
"description": "Regular Ticket to Event"
},
{
"quantity": "1",
"description": "Regular Ticket to Event"
},
]
但是,我想将类似的项目组合在一起,因此最后我有以下几点:
[
{
"quantity": "3",
"description": "VIP Tickets to Event"
},
{
"quantity": "2",
"description": "Regular Tickets to Event"
}
]
这很不幸,但我不能改变数据库结构,所以我唯一能做的就是处理结果。进行这种分组的一种好的、有效的方法是什么
这被标记为laravel和javascript,因为我还需要将相同的解决方案应用到我的前端。您可以使用
reduce
创建具有更新结构的新数组-按说明分组
var grouped = arr.reduce(function(groups, current) {
var found = false;
for (var i = 0; i < groups.length; i++) {
if (groups[i].description == current.description) {
groups[i].quantity++;
found = true;
}
}
if (!found) {
groups.push(current);
}
return groups;
}, []);
var group=arr.reduce(功能(组,当前){
var=false;
对于(变量i=0;i
这是一个带有临时对象的提案,用于引用具有相同描述的对象
var数组=[{“数量”:“1”,“说明”:“活动贵宾票”},{“数量”:“1”,“说明”:“活动贵宾票”},{“数量”:“1”,“说明”:“活动贵宾票”},{“数量”:“1”,“说明”:“活动贵宾票”},{“数量”:“1”,“说明”:“活动贵宾票”},],
分组=[];
array.forEach(函数(a){
如果(!此[a.说明]){
此[a.description]={description:a.description,数量:0};
push(这个[a.描述]);
}
此[a.说明].数量+=+a.数量;
}, {});
document.write(“”+JSON.stringify(分组,0,4)+“”)代码>使用临时对象
var d=[{“数量”:“1”,“描述”:“活动贵宾票”},{“数量”:“1”,“描述”:“活动贵宾票”},{“数量”:“1”,“描述”:“活动贵宾票”},{“数量”:“1”,“描述”:“活动贵宾票”},{“数量”:“1”,“描述”:“活动贵宾票”};
var o={};
d、 forEach(e=>o[e.description]=o[e.description]++e.quantity | |+e.quantity);
var r=Object.keys(o.map)(e=>({quantity:o[e],description:e}));
write(“”+JSON.stringify(r,0,2)+“”)
一种不同类型的reduce
,您不必为输入数组中的每个项目迭代组数组来检查是否存在
使用缩减值本身作为hashMap检查重复
最后使用map
将简化后的对象转换为数组
检查工作箱。我把数量改成了数字。还将一些值更改为2,以表明其工作正常。JSON是从?
var groupedItemsObj = items.reduce(function(previous, next){
if(previous[next.description]){
var updatedQuantity = previous[next.description].quantity + next.quantity;
previous[next.description] = {quantity: updatedQuantity, description: next.description};
}else{
previous[next.description] = next;
}
return previous;
}, {});
var groupedItemsArray = Object.keys(groupedItemsObj).map(function(key){
return groupedItemsObj[key];
});