Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按公共键汇总JSON数组项_Javascript_Arrays_Json - Fatal编程技术网

Javascript 按公共键汇总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": "

我在构建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": "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会把事情搞得更糟是个好主意。