Javascript 按公共键汇总JSON数组项
我在构建JSON数组时面临一个棘手的问题Javascript 按公共键汇总JSON数组项,javascript,arrays,json,Javascript,Arrays,Json,我在构建JSON数组时面临一个棘手的问题 I have a below JSON where products are duplicated, var mainJson = [{ "product": "pen", "quantity": 3 }, { "product": "pen", "quantity": 3 }, { "product": "pencil", "quantity": 4 }, { "product": "
I have a below JSON where products are duplicated,
var mainJson = [{
"product": "pen",
"quantity": 3
}, {
"product": "pen",
"quantity": 3
}, {
"product": "pencil",
"quantity": 4
}, {
"product": "pencil",
"quantity": 4
}]
现在我想删除重复的,我想添加数量字段,我的最终输出应该如下所示
var finalOutput = [{
"product":"pen",
"quantity":6
},{
"product":"pencil",
"quantity":8
}]
我可以删除具有相同产品名称的重复记录,但在删除时我无法连接数量字段
有人能帮我解决这个问题吗
提前感谢您您可以浏览源阵列,使用并插入结果阵列项目,第一次找到产品价值,或者添加当前数量(如果已经存在): const mainJson=[{product:pen,quantity:3},{product:pen,quantity:3},{product:pencil,quantity:4},{product:pencil,quantity:4}], groupped=mainJson.reduceres,{product,quantity}=>{ const group=res.finditem=>item.product==product 组 组数量+=数量: res.push{产品,数量} 返回res }, [] console.loggroupped
.作为控制台包装器{min height:100%}您可以遍历源数组,使用并插入结果数组项,第一次找到产品值,或者添加当前数量(如果已经存在): const mainJson=[{product:pen,quantity:3},{product:pen,quantity:3},{product:pencil,quantity:4},{product:pencil,quantity:4}], groupped=mainJson.reduceres,{product,quantity}=>{ const group=res.finditem=>item.product==product 组 组数量+=数量: res.push{产品,数量} 返回res }, [] console.loggroupped
.作为控制台包装器{min height:100%}我将分两个阶段完成。首先,我会将其转化为一个对象,以产品为键,以数量为值 这可以很好地处理重复项,因为对象键永远不会被复制 然后,我将使用将其映射回所需格式的数组。使用可使此步骤非常干净
const mainJson = [
{
product: "pen",
quantity: 3
},
{
product: "pen",
quantity: 3
},
{
product: "pencil",
quantity: 4
},
{
product: "pencil",
quantity: 4
}
];
const productQuantities = mainJson.reduce((acc, curr) => {
const { product, quantity } = curr;
const currentValue = acc[product] || 0; // default to zero if not set yet
return {
...acc,
[product]: currentValue + quantity
};
}, {});
console.log(productQuantities);
const productQuantitiesArray = Object.entries(
productQuantities
).map(([product, quantity]) => ({ product, quantity }));
console.log(productQuantitiesArray);
我会分两个阶段来做。首先,我会将其转化为一个对象,以产品为键,以数量为值 这可以很好地处理重复项,因为对象键永远不会被复制 然后,我将使用将其映射回所需格式的数组。使用可使此步骤非常干净
const mainJson = [
{
product: "pen",
quantity: 3
},
{
product: "pen",
quantity: 3
},
{
product: "pencil",
quantity: 4
},
{
product: "pencil",
quantity: 4
}
];
const productQuantities = mainJson.reduce((acc, curr) => {
const { product, quantity } = curr;
const currentValue = acc[product] || 0; // default to zero if not set yet
return {
...acc,
[product]: currentValue + quantity
};
}, {});
console.log(productQuantities);
const productQuantitiesArray = Object.entries(
productQuantities
).map(([product, quantity]) => ({ product, quantity }));
console.log(productQuantitiesArray);
我们可以使用reduce函数:
const result = mainJson.reduce( (a, {product, quantity})=> {
a[product] = a[product] || {product, quantity: 0};
a[product].quantity += quantity;
return a;
},{})
例如:
var mainJson=[{
产品:钢笔,,
数量:3
}, {
产品:钢笔,,
数量:3
}, {
产品:铅笔,,
数量:4
}, {
产品:铅笔,,
数量:4
}];
const result=mainJson.reduce a,{product,quantity}=>{
a[产品]=a[产品]|{产品,数量:0};
a【产品】。数量+=数量;
返回a;
},{}
console.logObject.valuesresult 我们可以使用reduce函数:
const result = mainJson.reduce( (a, {product, quantity})=> {
a[product] = a[product] || {product, quantity: 0};
a[product].quantity += quantity;
return a;
},{})
例如:
var mainJson=[{
产品:钢笔,,
数量:3
}, {
产品:钢笔,,
数量:3
}, {
产品:铅笔,,
数量:4
}, {
产品:铅笔,,
数量:4
}];
const result=mainJson.reduce a,{product,quantity}=>{
a[产品]=a[产品]|{产品,数量:0};
a【产品】。数量+=数量;
返回a;
},{}
console.logObject.valuesresult 虽然reduce方法相当于Javascript,但如果您更喜欢一种更通用的方法,可以通过两个步骤完成:
迭代JSON并创建一个没有重复项的映射;
迭代映射并获得最终的JSON。
请记住,这种解决方案是困难的,而且比reduce方法慢。如果你坚持使用更好的reduce选项,我不会责怪你,我只是想指出这个更通用的方法!结果是一样的
按照这些步骤,我们有:
var mainJson=[{product:pen,数量:3},{product:pen,数量:3},
{产品:铅笔,数量:4},{产品:铅笔,数量:4}];
//第一步
var mapJson=新映射;
mainJson的forlet项
{
如果mapJson.hasitem.product
mapJson.setitem.product,mapJson.getitem.product+item.quantity;
其他的
mapJson.setitem.product、item.quantity;
}
//步骤2
var finalJson=[];
mapJson的forlet项
push{product:item[0],quantity:item[1]};
console.logfinalJson 虽然reduce方法相当于Javascript,但如果您更喜欢一种更通用的方法,可以通过两个步骤完成:
迭代JSON并创建一个没有重复项的映射;
迭代映射并获得最终的JSON。
请记住,这种解决方案是困难的,而且比reduce方法慢。如果你坚持使用更好的reduce选项,我不会责怪你,我只是想指出这个更通用的方法!结果是一样的
按照这些步骤,我们有:
var mainJson=[{product:pen,数量:3},{product:pen,数量:3},
{产品:铅笔,数量:4},{产品:铅笔,数量:4}];
//第一步
var mapJson=新映射;
mainJson的forlet项
{
如果mapJson.hasitem.product
mapJson.setitem.product,mapJson.getitem.product+item.quantity;
其他的
mapJson.setitem.product,i
数量;
}
//步骤2
var finalJson=[];
mapJson的forlet项
push{product:item[0],quantity:item[1]};
console.logfinalJson;代码应该返回pen为6,pencil为8,但它分别返回3和4。代码应该返回pen为6,pencil为8,但它分别返回3和4。您在这里是正确的,我认为这个解决方案对性能的影响也是因为我的reduce函数每次都会创建一个新对象,使其保持为纯函数。你是对的,这种方法仍然会降低性能,但是纯函数有很多好处,可以减少意外的副作用,所以我不确定称之为纯函数是否正确flaw@YevgenGorbunkov看起来我的类似解决方案依赖于Object.values的实现。但是,我们可以重写此方法以避免性能缺点@CameronDowner您可以通过在此处使用Object.values yourObjectHere来避免性能方面的缺点。@Steppup:看起来像,Object.keys,您的关注点非常简单,无需使用本机代码。您在此处是正确的,我认为这个解决方案对性能的影响也是因为我的reduce函数每次都会创建一个新对象,使其保持为纯函数。你是对的,这种方法仍然会降低性能,但是纯函数有很多好处,可以减少意外的副作用,所以我不确定称之为纯函数是否正确flaw@YevgenGorbunkov看起来我的类似解决方案依赖于Object.values的实现。但是,我们可以重写此方法以避免性能缺点@CameronDowner您可以通过在此处使用Object.values yourObjectHere来避免性能方面的缺点。@Stepp:看起来像,Object.keys可以轻松轻松地为您的关注点设置关键帧,而无需使用本机code@StepUp:随着唯一产品项的数量接近源阵列大小,由find执行的回溯可能比处理数据类型执行的回溯慢。但是,我认为覆盖Object.values并不能把事情搞得更糟。@steup:随着唯一产品项的数量接近源数组的大小,find执行的回溯可能比处理数据类型慢。然而,我不认为覆盖Object.values会把事情搞得更糟是个好主意。