如何在咖啡脚本中总结 JSON 对象的属性?

Posted

技术标签:

【中文标题】如何在咖啡脚本中总结 JSON 对象的属性?【英文标题】:How do I sum up properties of a JSON object in coffescript? 【发布时间】:2011-11-22 06:28:45 【问题描述】:

我有一个看起来像这样的对象:

object =
  title : 'an object'
  properties :
    attribute1 :
      random_number: 2
      attribute_values:
        a: 10
        b: 'irrelevant'
    attribute2 :
      random_number: 4
      attribute_values:
        a: 15
        b: 'irrelevant'
   some_random_stuff: 'random stuff'

我想提取属性 1 和属性 2 上“a”值的总和。 在 Coffeescript 中执行此操作的最佳方法是什么?

(我已经找到了一种方法,但它看起来就像 Java 翻译成咖啡,我希望有一个更优雅的解决方案。)

【问题讨论】:

【参考方案1】:

这是我想出的(根据评论编辑为更通用):

sum_attributes = (x) =>
  sum = 0
  for name, value of object.properties 
    sum += value.attribute_values[x]
  sum

alert sum_attributes('a') # 25
alert sum_attributes('b') # 0irrelevantirrelevant

所以,这就是你想要的......但它可能不会完全按照你想要的字符串来做。 您可能想要传入累加器种子,例如 sum_attributes 0, 'a'sum_attributes '', 'b'

【讨论】:

谢谢!我想我遗漏了一条信息,对此我很抱歉。假设“b”也是一个可以累积的属性,并且我有一个可以接受 a 或 b 作为变量的函数,我可以使用相同的方法吗?我试图按照(给定的 x 函数输入)为 k,v of object.properties sum += value.attribue_values[x] 进行,但它不起作用。很抱歉,我忘了在我的问题中留下那部分,所以我仍然赞成回复,因为它是现场的:) @user957731:我将回复编辑为更通用。这是你要找的吗?【参考方案2】:

Brian 的回答很好。但是如果你想引入像Underscore.js 这样的函数式编程库,你可以写一个更简洁的版本:

sum = (arr) -> _.reduce arr, ((memo, num) -> memo + num), 0
sum _.pluck(object.properties, 'a')

【讨论】:

谢谢。如果我发现自己经常做这类事情,我会调查一下。 +1 是的,我考虑过去那里......但我想我会直接坚持使用 CoffeeScript。【参考方案3】:
total = (attr.attribute_values.a for key, attr of obj.properties).reduce (a,b) -> a+b

sum = (arr) -> arr.reduce((a, b) -> a+b)
total = sum (attr.attribute_values.a for k, attr of obj.properties)

【讨论】:

我喜欢这样。它让我在谷歌上搜索列表理解和折叠。似乎我不需要考虑 underscore.js :) 当只有一个值要包含在总和中时,我无法让它工作,因为 reduce 似乎是在不是数组的东西上调用的但我有几种情况需要做这种操作,我知道不会这样。 哎呀。这就是 underscore 的勇气会有所帮助的地方。你也可以使用(attr.attribute_values.a or 0 for key, attr of obj.properties),尽管有点无能。

以上是关于如何在咖啡脚本中总结 JSON 对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章

CoffeeScript - 如何在 ruby​​ on rails 中使用咖啡脚本?

在 onclick 属性中使用咖啡脚本创建函数 [重复]

如何在 Rails 5 上禁用咖啡脚本

构建咖啡脚本代码?

减少咖啡脚本中的循环

您如何在 Rails 3.1 中使用 Sprockets 编写干燥的模块化咖啡脚本?