通过参数组合和分组javascript对象的最佳方法

通过参数组合和分组javascript对象的最佳方法,javascript,Javascript,我正在React中的购物车页面上工作,基本上我需要按产品名称对订单进行分组,并包括数量 所以。。。如果我的产品数组如下所示 const items = [ { title: 'Test', price: 1 }, { title: 'Test', price: 1 }, { title: 'Another Test', price: 3 }, ] 我正试图得到像 const expected = [ { title: 'Test', price: 1, quantity: 2

我正在React中的购物车页面上工作,基本上我需要按产品名称对订单进行分组,并包括数量

所以。。。如果我的产品数组如下所示

const items = [
  { title: 'Test', price: 1 },
  { title: 'Test', price: 1 },
  { title: 'Another Test', price: 3 },
]
我正试图得到像

const expected = [
  { title: 'Test', price: 1, quantity: 2 },
  { title: 'Another Test', price: 3, quantity: 1 },
]
我尝试了几种不同的方法,但都没有达到目的,包括使用来自下划线的groupBy,但没有乐趣


这里有一个我一直在玩的JS小提琴:

在普通javascript中,您可以使用
reduce()
来实现这一点

const项=[
{标题:'测试',价格:1},
{标题:'测试',价格:1},
{标题:“另一项测试”,价格:3}
]
var o={}
var结果=项目。减少(功能(r,e){
如果(!o[e.title]){
o[e.头衔]=e;
o[e.title]。数量=0;
r、 推送(o[e.标题])
}
o[e.title]。数量+=1;
返回r;
}, [])

console.log(result)
您可以按产品名称/标题/ID使用字典。在每个项目上循环,添加新条目或增加现有条目的数量:

const项=[
{标题:'测试',价格:1},
{标题:'测试',价格:1},
{标题:“另一项测试”,价格:3}
];
让cart={};
items.forEach(item=>{
if(购物车[商品名称]){
购物车[项目.标题].数量++;
}否则{
购物车[item.title]={price:item.price,数量:1};
}
});
控制台日志(购物车)可用于分组

var items=[{title:'Test',price:1},{title:'Test',price:1},{title:'other Test',price:3}],
分组=项目。减少((映射=>(r,a)=>{
如果(!map.has(a.title)){
map.set(a.title,{title:a.title,price:a.price,quantity:0});
r、 推(地图、获取(标题));
}
map.get(a.title).quantity++;
返回r;
})(新地图),[]);
控制台日志(分组)
.as控制台包装{max height:100%!important;top:0;}
另一个应用
数组的简短版本。prototype.reduce
函数:

var items=[{title:'Test',price:1},{title:'Test',price:1},{title:'other Test',price:3}],
预期=[];
reduce(函数(o,a){//通过'title'属性对对象进行分组
(o[a.标题])?
++o[a.标题].数量
:o[a.title]=预期的[expected.push({title:a.title,price:a.price,quantity:1})-1];
返回o;
}, {});

console.log(预期)如果您可以在项目中使用lodash库,我建议您使用lodash
unionBy

const项=[
{标题:'测试',价格:1},
{标题:'测试',价格:1},
{标题:'另一个测试',价格:3},
]; 
让items1=uz.map(项,函数(o){
o、 数量=1;
返回o;
});
结果=uu.unionWith(项1,函数(a,b){
如果(a.title==b.title){
b、 数量++;
返回true;
}
返回false;
});
控制台日志(结果)

标题应该是唯一的?@Smiranin为什么?因为他没有身份证?否则idk为什么标题必须是唯一的。我会使用
如果(!Object.prototype.hasOwnProperty.call(o,e.title)){
,因为如果标题是
toString
toValue
或对象属性链上的任何其他名称,它就会中断。这太完美了!非常感谢!喜欢使用地图