【问题标题】:Get unique values and their amounts from an array of objects从对象数组中获取唯一值及其数量
【发布时间】:2019-11-14 08:33:05
【问题描述】:

所以我收到一个 JSON 请求,该请求发送具有两个属性的对象数组,我需要提取唯一值及其数量。

这是通过 Postman 发送的 JSON:

[
    {"name": "First value", "amount": 2},
    {"name": "Second value", "amount": 4},
    {"name": "First value", "amount": 6}  
]

我需要返回一个 JSON 响应,其中包含唯一值及其总和:

对象应如下所示:

{
   "First value": 8,
   "Second value": 4
}

【问题讨论】:

    标签: javascript arrays node.js json object


    【解决方案1】:

    您也可以简单地使用Array.forEach,因为它在很大程度上更容易理解和遵循:

    let arr = [{ "name": "First value", "amount": 2 }, { "name": "Second value", "amount": 4 }, { "name": "First value", "amount": 6 } ],
        obj={}
    
    arr.forEach(({name, amount}) => {
      obj[name] = obj[name] || 0
      obj[name] += amount
    })
    
    console.log(obj)

    这里的主要区别是我们的accumulatorobj)是在外部而不是“内部”定义为Array.reduce函数的参数。

    【讨论】:

      【解决方案2】:

      您可以使用reduce()

      const arr = [ 
          {"name": "First value", "amount": 2},
          {"name": "Second value", "amount": 4},
          {"name": "First value", "amount": 6}  
      ]
      
      const res = arr.reduce((ac, {name, amount}) => {
        ac[name] = ac[name] || 0;
        ac[name] += amount;
        return ac;
      },{})
      
      console.log(res)

      说明:

      首先,我们将ac 初始化为一个空对象{}。见行

      arr.reduce((ac, {name, amount}) => {...}
                      ^^^^^^^^^^^^^^ 
      

      突出显示的部分称为对象解构。它将从我们正在迭代的当前对象中获取属性nameamount,并使其成为独立变量。

      看线

      ac[name] = ac[name] || 0;
      

      现在这一行正在检查ac[name] 是否在ac 对象上不存在,那么它将是undefined,因此undefined || 0 将被评估为0。如果它有一个值,ac[name] 的值将保持以前的值。

      见第三行:

      ac[name] += amount;
      

      此行会将amount 添加到ac[name] 的已有值

      最后我们返回ac,让它成为ac的初始值,用于下一次迭代。

      【讨论】:

      • 工作得很好,但是,你能详细说明一下蓄能器是如何工作的吗?不太明白,非常感谢!
      • 反响很好。比我想出的疯狂要简单得多。
      • @Scarecrowsama 你了解reduce() 的一般工作原理还是根本不了解reduce()
      • 我了解数字的基础知识,但是这个对象创建有点令人困惑,我猜测 ac[name] 行基本上就像在没有值的情况下执行 {name:} 一样,我知道当你发送一个表单,body 是一个对象,你可以像 object[property] o object.property 一样访问它,对吗?
      • @Scarecrowsama 我已经添加了一个解释,询问您是否有任何不明白的地方。如果您什么都不懂,请考虑接受答案。
      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多