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

Merge values of an array and sum duplicate values

我知道有几个针对 vanilla JS 的解决方案,但我似乎无法在 Framer 的 Coffeescript 中实现这些解决方案。

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

因此,例如以下数组将合并为一个

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

将产生以下结果:

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

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

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,逻辑几乎相同。