合并数组的值并对重复值求和

Posted

技术标签:

【中文标题】合并数组的值并对重复值求和【英文标题】:Merge values of an array and sum duplicate values 【发布时间】:2018-07-08 21:36:58 【问题描述】:

我知道有一些适用于 vanilla JS 的解决方案,但我似乎无法在 Framer 的 Coffeescript 中实现这些解决方案。

我正在尝试遍历嵌套数组的数组,并在添加第二项的值时合并嵌套数组的第一项的重复值。

所以例如下面的数组将被合并为一个

fruit = [
  ["bananas", 2],
  ["apples", 1],
  ["oranges", 2],
  ["bananas", 1],
  ["oranges", 2],
  ["apples", 3]
]

将导致以下结果:

combinedFruit = [
  ["bananas", 3],
  ["apples", 4],
  ["oranges", 4]
]

【问题讨论】:

【参考方案1】:

这类事情的常用方法是使用一个对象来跟踪你的总和:

sum_fruit_counters = (obj, [fruit, n]) ->
  obj[fruit] = 0 if fruit !of obj
  obj[fruit] += n
  obj
obj = fruit.reduce(sum_fruit_counters,  )

或者如果您愿意:

sum_fruit_counters = (obj, [fruit, n]) ->
  obj[fruit] = (obj[fruit] || 0) + n
  obj
obj = fruit.reduce(sum_fruit_counters,  )

但这会给您留下一个对象,而不是您想要的数组数组。你可以使用Object.entries 来处理这个问题:

a = Object.entries(fruit.reduce(sum_fruit_counters,  ))

或者用一个简单的循环手动完成:

obj = fruit.reduce(sum_fruit_counters,  )
a   = ([k, v] for k, v of obj)

您也可以使用循环代替reduce,逻辑几乎相同。

【讨论】:

以上是关于合并数组的值并对重复值求和的主要内容,如果未能解决你的问题,请参考以下文章

合并两个地图并对相同键的值求和的最佳方法?

Flutter:如何合并两个对象并对同一个key的值求和?

合并两个数组,并且把相同的数值覆盖掉

PHP合并数组只有不重复的值

在Python中按日期合并行和求和值[重复]

使用值将数组中对象的属性合并在一起并删除重复项