合并两个对象具有相同的键名并进行计算

问题描述 投票:-3回答:2

我正在尝试组织一个具有不同数值的重复值(橙色)的数组...所以我想合并相似的值并计算数量。

如果我使用水果名称但它的随机名称,我可以做到这一点。

var Orders = [
{Fruit: "Orange", Quantity: 1000},
{Fruit: "Banana", Quantity: 2000},
{Fruit: "Orange", Quantity: 6000}];

var finalOrder = [];
var Quantity = 0;

for (var i in Orders) {

        Quantity += Orders[i].Quantity;
        var Fruits = Orders[i].Fruit;

        var Order = {
            Fruit: Fruits,
            Quantity: Quantity
        }

        finalOrder.push(Order);
}

console.log(finalOrder);

我期待输出

0: {Fruit: "Orange", Quantity: 1000}
1: {Fruit: "Banana", Quantity: 3000}
3: {Fruit: "Orange", Quantity: 9000}

成为

0: {Fruit: "Orange", Quantity: 7000}
1: {Fruit: "Banana", Quantity: 2000}
javascript jquery arrays json
2个回答
0
投票

缩小为Fruit索引的对象,其值是关联的水果键的数量,然后获取该对象的值:

var Orders = [{
    Fruit: "Orange",
    Quantity: 1000
  },
  {
    Fruit: "Banana",
    Quantity: 2000
  },
  {
    Fruit: "Orange",
    Quantity: 6000
  }
];

const output = Object.values(Orders.reduce((a, { Fruit, Quantity }) => {
  if (!a[Fruit]) a[Fruit] = { Fruit, Quantity };
  else a[Fruit].Quantity += Quantity;
  return a;
}, {}));
console.log(output);

1
投票

您的代码的主要问题是,您为所有数量采用单个变量,并且您不会查找相同的Fruit

对于此部分,您需要另一个循环,如果找到更新Quantity并退出内部循环,或向结果集添加新对象。

var orders = [{ Fruit: "Orange", Quantity: 1000 }, { Fruit: "Banana", Quantity: 2000 }, { Fruit: "Orange", Quantity: 6000 }],
   finalOrder = [],
   i, j;

outer: for (i = 0; i < orders.length; i++) {
    for (j = 0; j < finalOrder.length; j++) {
        if (orders[i].Fruit === finalOrder[j].Fruit) {
            finalOrder[j].Quantity += orders[i].Quantity;
            continue outer;
        }
    }
    finalOrder.push({ Fruit: orders[i].Fruit, Quantity: orders[i].Quantity });
}

console.log(finalOrder);

或者您可以采用Map和简单的键/值方法,因为您只有两个属性可以正常使用此方法。

var orders = [{ Fruit: "Orange", Quantity: 1000 }, { Fruit: "Banana", Quantity: 2000 }, { Fruit: "Orange", Quantity: 6000 }],
    result = Array.from(
        orders.reduce((m, { Fruit, Quantity }) => m.set(Fruit, (m.get(Fruit) || 0) + Quantity), new Map),
        ([Fruit, Quantity]) => ({ Fruit, Quantity })
    );

console.log(result);
© www.soinside.com 2019 - 2024. All rights reserved.