如何在咖啡脚本中总结 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 对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章