【问题标题】:Merge two objects has the same key name and do a calculation合并两个具有相同键名的对象并进行计算
【发布时间】:2019-04-30 06:34:58
【问题描述】:

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

如果我使用水果名称而不是它的随机名称,我可以做到。

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


    【解决方案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);

    【讨论】:

    • 您的解决方案对我也很有效。谢谢
    【解决方案2】:

    归约为由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);

    【讨论】:

    • 这就是我得到的(0:{水果:未定义,数量:9000})
    • 按“运行代码 sn-p” - 您应该会看到输出符合要求。该代码在 Chrome、Firefox 和 Opera 中都非常适合我。如果您逐字使用答案中的代码,它也应该对您有用。
    • 这是真的,代码 sn-p 运行良好,但我使用的是 Chrome,这就是我得到的
    • 请发布一个minimal reproducible example 来说明问题 - 正如您所看到的,如果您按下“运行代码 sn-p”按钮,输出正是您想要的。如果您收到{Fruit: undefined,那么您使用的代码与答案中的代码不同。你也可以在 JSFiddle 上查看它,代码也可以在那里工作:jsfiddle.net/cm786vdo
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多