2016-05-13 3 views
2

reduce()を使って計算したと思ったが、それぞれのレコードで複数のプロパティをロールバックする必要があるので、オブジェクトを返すたびに私が持っている問題は、previousValueがEmberオブジェクトであり、普通のオブジェクトを返すので、最初のループで正常に動作しますが、2回目にはaはもはやEmberオブジェクトではなく、エラーが発生しますa.get is not a functionと言っています。サンプルコード:Ember.js:モデルレコードを1つのレコードに集計する

/* 
filter the model to get only one food category, which is determined by the user selecting a choice that sets the property: theCategory 
*/ 
var foodByCategory = get(this, 'model').filter(function(rec) { 
    return get(rec, 'category') === theCategory; 
}); 

/* 
Now, roll up all the food records to get a total 
of all cost, salePrice, and weight 
*/ 
summary = foodByCategory.reduce(function(a,b){ 
    return { 
    cost: a.get('cost') + b.get('cost'), 
    salePrice: a.get('salePrice') + b.get('salePrice'), 
    weight: a.get('weight') + b.get('weight') 
    }; 
}); 

私はこれについてすべて間違っていますか? modelから複数のレコードを1つのレコードにロールアップするより良い方法はありますか?あるいは、単純にモデルレコードを平坦なオブジェクトにフラット化するか、代わりにreduce()のEmberオブジェクトを返すだけですか?

編集:return Ember.Object.create({...})が仕事をしてやって、私はまだ、この目標を達成するための最良の方法である、またはかどうかにいくつかの意見をしたいと思いエンバーは、この操作を行うと、もしそうなら、彼らはしている場合だろうな機能を提供する場合reduceよりも優れています。 this.get('model')を想定し

+0

emberデータを使用していますか? –

+0

@selvaraj:はい私は – redOctober13

+0

ですこのコードはどこですか? – locks

答えて

0

Ember.Enumerable返し、あなたはfilterの代わりにfilterByを使用することができますよう

var foodByCategory = get(this, 'model').filterBy('category', theCategory); 

をごreduceために、私はそれを改善する任意のエンバー組み込み関数を知りません。

summary = { 
    cost: foodByCategory.mapBy('cost').reduce(...), 
    salePrice: foodByCategory.mapBy('salePrice').reduce(...), 
    ... 
}; 

しかし、それはおそらくあまりパフォーマンスだ:私は考えることができる最善のは、複数の別々のmapByreduce呼び出しを使用しています。私はEmberの組み込み関数を使って標準的なデータ操作を行うことについてあまり心配しません...私が知っているEmberプロジェクトのほとんどはEmber自身と並んでユーティリティライブラリ(Lodashなど)を使用しています。のデータ変換。

+0

ありがとう。私はそれがデータをロールアップするための単純なJavaScriptであることは問題ありません。あなたの意見では、 'reduce()'がこれを行う最良の方法ですか?本質的に私は単一のレコードで新しいモデルを作成しようとしています。私はまた、ロールアップされたプロパティに基づいて 'summary'に追加のプロパティを追加しています。私は代わりにルートでこれを行う必要があります、カテゴリでロールアップし、コントローラで単に 'filterBy'ですか? – redOctober13

+0

@ redOctober13は、「最高」という意味で決まります。 'reduce'は間違いなくそれを行う良い方法です。あなたの状況に最適なものを言うのに十分な文脈を持っているのかどうかはわかりませんが、たとえモデルでなくても、アプリケーションのファーストクラスのObjectです。私は、 '' Summary = Ember.Object.extend({...} '')としてSummary "class"を作成することを検討したいので、より多くのオブジェクト指向でComputed Propertiesを定義することができます。 .create(foodByCategory.reduce(...)) '、あなたの' reduce'がPOJOを返します。私のコメントが明確でない場合に教えてください。 –

+0

@ redOctober13ああ、何か:http://emberjs.com/api /#method_get( 'Ember.get(obj、key)')便利です:POJOと 'Ember.Object'の両方で動作します。 –

関連する問題