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

如果满足两个条件,Javascript值的总和[重复]

穆仲卿
2023-03-14

如果CategoryId相同,下面是一个代码,用于添加金额,并根据CategoryId创建一个新的行项目。

self.OriginalLineItems = [
    { CategoryId: 'Cat1', Amount: 15, Type: 'TypeA' },
    { CategoryId: 'Cat1', Amount: 30, Type: 'TypeA' },
    { CategoryId: 'Cat1', Amount: 20, Type: 'TypeB' },
    { CategoryId: 'Cat2', Amount: 10, Type: 'TypeA' },
    { CategoryId: 'Cat2', Amount: 5, Type: 'TypeB' }]

self.newLineItems = [];

self.OriginalLineItems.forEach(function (o) {
    if (!this[o.CategoryId]) {
        this[o.CategoryId] = { CategoryId: o.CategoryId, Amount: 0, Type: o.Type };
        self.newLineItems.push(this[o.CategoryId]);
    }
    this[o.CategoryId].Amount += o.Amount;
}, Object.create(null));

这将导致以下数组:

self.newLineItems = [{ CategoryId: 'Cat1', Amount: 65, Type: 'TypeA' }, 
                     { CategoryId: 'Cat2', Amount: 15, Type: 'TypeA' }]

但我想添加一个新的条件,即类型,我如何得到下面的结果?

self.newLineItems = [{ CategoryId: 'Cat1', Amount: 45, Type: 'TypeA' }, 
                     { CategoryId: 'Cat1', Amount: 20, Type: 'TypeB' }, 
                     { CategoryId: 'Cat2', Amount: 10, Type: 'TypeA' }, 
                     { CategoryId: 'Cat2', Amount: 5, Type: 'TypeB' }]

我找不到有关问题的解决办法。


共有2个答案

洪德寿
2023-03-14

可以为对象制作关键点(在循环中),如下所示:

const key = JSON.stringify([o.CategoryId, o.Type]);

然后用这个[key]替换这个[o.CategoryId]。就这样。

申屠昌胤
2023-03-14

您可以使用reduce()findIndex()every()来实现这一点。

  1. duce()中将累加器设置为[]
  2. 然后使用findIndex()ac中查找所有键都相同的对象
  3. 您需要在findIndex()中使用each()来检查所有需要匹配的是否具有相同的值。
  4. 如果findIndex()返回-1将项目添加到ac,否则增加找到的索引处的项目数量
let array = [
    { CategoryId: 'Cat1', Amount: 15, Type: 'TypeA' },
    { CategoryId: 'Cat1', Amount: 30, Type: 'TypeA' },
    { CategoryId: 'Cat1', Amount: 20, Type: 'TypeB' },
    { CategoryId: 'Cat2', Amount: 10, Type: 'TypeA' },
    { CategoryId: 'Cat2', Amount: 5, Type: 'TypeB' }]
function addBy(arr,keys){
  return arr.reduce((ac,a) => {
    let ind = ac.findIndex(x => keys.every(k => x[k] === a[k]));
    ind === -1 ? ac.push(a) : ac[ind].Amount += a.Amount;
    return ac;
  },[])
}
console.log(addBy(array,["CategoryId","Type"]));
 类似资料:
  • 问题内容: 我的数据结构如下: 我正在尝试进行一个SQL查询,该查询将计算正在运行的SUM,但在小时数为3时将重置。结果应如下所示: 问题答案: 您可以使用条件总和创建子组:

  • 问题内容: 我有一个需要处理的大型numpy数组,以便在满足条件的情况下将每个元素更改为1或0(稍后将用作像素遮罩)。数组中大约有800万个元素,而我当前的方法对于简化流程花费的时间太长: 是否有一个numpy函数可以加快速度? 问题答案: 您可以使用以下方法来缩短它:

  • 问题内容: 我想要一种改进我的sql代码的好方法,当条件满足时,我必须使用内部联接。我目前正在复制代码: 我想以这种方式做到这一点: 编辑: 解决方案(由于@Damien_The_Unbeliever): 问题答案: 这应该(大约)执行相同的操作: 当然,这还意味着必须编写对其中的列的任何其他引用,以期望此类列为。

  • 每个代理都有一个私有布尔变量“Happy?”。如何用[Happy?=True]计算特工人数? 就餐时有没有直接的方法?或者我遍历了所有的代理,然后逐个计算? 更新: 我尝试过全局调度方法:https://repast.github.io/docs/RepastReference/RepastReference.html#schedule-全球的 当我使用ContextBuilder中的@schdu

  • 问题内容: 给定以下示例表架构 客户表 发票表 目的是选择InvoiceID值为10和20(非OR)的所有客户。因此,在此示例中,将返回带有CustID = 1和2的客户。 您将如何构造SELECT语句? 问题答案: 使用: 关键是需要计数等于子句中参数的数量。 的使用是在对帐务编号和发票编号的组合没有唯一约束的情况下- 如果没有重复的机会,则可以从查询中省略DISTINCT:

  • 在我的实际数据集中,我有许多列以cent_dept开始,以agg结束,所以选择与组件匹配的用户是非常重要的。 谢谢你的帮助!