2011-09-21 8 views
3

私はこの1つのように見えるオブジェクトを持っている: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の上の「」の値の合計を抽出したいです。
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

:あなたはUnderscore.jsのような関数型プログラミングライブラリに持参したい場合しかし、あなたはより簡潔バージョンを書くことができます!私は1つの情報を残してしまったと思いますが、それは残念です。 "b"は蓄積できるプロパティであり、変数としてaまたはbを受け入れる関数を持っていたとすれば、同じアプローチを使用することができますか? 私は、与えられた関数入力(xの関数入力)に沿って、object.propertiesのk、vに対して を調べようとしました。 sum + = value.attribue_values [x] これはうまくいきませんでした。私は私の質問にその部分を残して忘れてしまって残念です。だから私はまだそれが現場のまま返信をupvoted :) – ivarni

+0

@ user957731:私はより一般的な私の応答を編集しました。これはあなたが探しているものですか? –

+1

それを見て、ありがとう! – ivarni

3

のように渡したい場合があります。ありがとう

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を考慮する必要はないようです:) reduceには配列ではないものが呼び出されるように見えるので、合計に含める値が1つしかない場合は、動作させることができません私はこの種の操作を行う必要があるいくつかのケースがあり、そうでないことはわかっています。 – ivarni

+0

oops。それがアンダースコアの抜け落ちが助けになる場所です。あなたはやや不備にもかかわらず、 '(attr.attribute_values.aまたはobj.propertiesのkey、attrのために)'を使用することもできます。 –

関連する問題