合并数组的值并将重复值相加

时间:2018-01-30 04:40:56

标签: arrays coffeescript sum

我知道有一些针对香草JS的解决方案,但我似乎无法在Framer的Coffeescript中使这些工作。

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

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

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

将导致以下结果:

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

1 个答案:

答案 0 :(得分:2)

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

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