当前位置: 首页 > 知识库问答 >
问题:

为相等的键添加多个集合对象值

越正阳
2023-03-14

我在一个集合实例中有多个具有相同键但不同值的对象。我需要一种方法添加数量字段键值在相同的对象。

[
    0 => {
      +"product_id": 1
      +"quantity": "50"
      +"price": "25.00"
    },
    1 => {
      +"product_id": 3
      +"quantity": "50"
      +"price": "75.00"
    },
    2 => {
      +"product_id": 2
      +"quantity": "50"
      +"price": "50.00"
    },
    3 => {
      +"product_id": 3
      +"quantity": "50"
      +"price": "75.00"
    }    
]

结果实例应该在相同的项键中添加数量,如下所示。

[
    0 => {
      +"product_id": 1
      +"quantity": "50"
      +"price": "25.00"
    },
    1 => {
      +"product_id": 2
      +"quantity": "50"
      +"price": "50.00"
    }
    2 => {
      +"product_id": 3
      +"quantity": "100"
      +"price": "75.00"
    }
]

我已经尝试遍历所有对象并添加/编辑对象,如下所示。我不确定这是不是Laravel收集中最好的练习方式。

$newItems = [];

$items->each(function ($item, $key) use ($items) {
    $existId = array_column($items, 'id');
    if($existId){
        // add quantity to the existing item
    } else {
        // push item to items array
    }
});

共有1个答案

赵君植
2023-03-14

您可以使用集合方法reduce创建一个新集合,您可以在其中添加新集合中尚未添加的项目,或者将其数量相加:

$total = $items->reduce(
  // The function that will insert or add the items together.
  function ($carry, $item) {
    if ($carry->has($item->product_id)) {
      $carry[$item->product_id]->quantity += $item->quantity;
    } else {
      $carry[$item->product_id] = $item;
    }
    return $carry;
  }, 
  // The initial empty collection that will be filled up every iteration.
  collect([])
);
 类似资料:
  • 我有一个POJO类,它已经定义了equals和hashcode,并用于许多保存到DB的遗留对象,因此不能改变该对象的工作方式。 她是一个简化的代码: 因此,我想基于雇员、startDate和contractCost将福利合同添加到中,以便消除基于这些字段的同一雇员的重复合同。 如果我不能重新定义equals和hashcode,那该怎么做呢?

  • 我有以下人物班- <代码>人。java - 现在,我有以下TreeClass实例- 打印时- 很明显,两个人的例子-

  • 我有3个实体类,它们彼此之间有关系 TestClassParent: TestClassChild: TestChildCollection: 当前我的数据库如下所示: 关系: 通过比较对象的电子邮件来实现对象的均衡 我有测试这个案例的代码: 我对这些物体的比较结果是错误的 我找了调试,发现第一个实例在电子邮件中有hashcode,另一个实例没有第一个: 第二个:

  • 这应该是非常简单的,但我还没有得到它的工作。 为什么我得到: 我想得到的是:

  • 问题内容: 什么类型的Java集合可为同一键返回多个值? 例如,我想为键300返回301,302,303。 问题答案: 您可以使用a 作为您的值: 另外,您可以按照biziclop的建议从Guava 中使用它,它的语法更加简洁,并且还有许多其他非常有用的实用程序方法:

  • 问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进

  • 本文向大家介绍Javascript搜索集合中的对象键,包括了Javascript搜索集合中的对象键的使用技巧和注意事项,需要的朋友参考一下 JavaScript中的Set类提供了一个has方法来搜索给定set对象中的元素。如果要在集合中搜索对象,则需要提供对该对象的引用。具有不同内存地址的相同对象不视为相等。此方法可以如下使用- 示例 输出结果

  • 我有一个ArrayList<code>data</code>,其中包含<code>Person</code>类型的Objects,它每n秒更新一次,并具有现有数据的总量。为了在表中显示这些数据,我使用<code>clear()</code>一个ObservableList,并使用<code>addAll(data)</ccode>来避免GUI阻塞。 我想使用HashSet作为Observable