2011-09-21 35 views
3

我有一个对象,看起来像这样的:如何总结coffescript中JSON对象的属性?

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' 

我想提取的总和上ATTRIBUTE1和attribute2“A”的值。
在Coffeescript中这样做的最佳方式是什么?

(我已经找到了这样做的一种方式,但是那只是看起来像Java转换后的咖啡,我希望的是更好的解决方案。)

回答

4

这里是我想出了(编辑基于评论更通用):

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'

+0

谢谢!我想我遗漏了一条信息,对此我很抱歉。假设“b”也是一个可以积累的属性,并且我有一个函数可以接受a或b作为变量,我是否可以使用相同的方法? 我试图去沿线(给定函数输入的x) for k,v of object.properties sum + = value.attribue_values [x] 哪些行不通。对不起,我忘了把这部分留在我的问题,所以我仍然upvoted的答复,因为它是现货:) – ivarni

+0

@ user957731:我编辑我的回应是更通用的。这是你想要的? –

+1

看起来它,谢谢! – ivarni

3

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

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

谢谢。如果我经常发现自己在做这些事情,我会研究一下。 – ivarni

+0

+1是的,我考虑去那里......但我想我会坚持使用CoffeeScript直接。 –

1
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) 
+0

我喜欢那样。它让我在列表理解和折叠上搜索。似乎我不需要考虑underscore.js然后:)我不能得到它的工作时,只有一个值将被包括在总和中,因为减少似乎被调用的东西不是一个数组但我有几种情况需要做这种手术,但我知道情况并非如此。 – ivarni

+0

oops。这是下划线的采摘会有所帮助的地方。你可以使用'(attr.attribute_values.a或0作为关键,obj.properties的attr)',尽管有些不起作用。 –