Arrays 将Meteor模板帮助程序返回的值用于其他计算[使用聚合求解]

Arrays 将Meteor模板帮助程序返回的值用于其他计算[使用聚合求解],arrays,meteor,meteor-blaze,Arrays,Meteor,Meteor Blaze,我很难理解如何在Meteor应用程序中运行一些简单的计算 以下帮助程序返回三个值(分子、分母和二者相除的结果)。前两个值当前来自一个集合(最终将来自API提要),并且依赖于来自不同集合(使用Template.parentData调用)的两个值。第三个值不会保存到数据库中。通过循环重复此顺序,以在表中显示三个值 Template.ValuationTable.helpers({ selections: function () { var selected = this.va

我很难理解如何在Meteor应用程序中运行一些简单的计算

以下帮助程序返回三个值(分子、分母和二者相除的结果)。前两个值当前来自一个集合(最终将来自API提要),并且依赖于来自不同集合(使用Template.parentData调用)的两个值。第三个值不会保存到数据库中。通过循环重复此顺序,以在表中显示三个值

Template.ValuationTable.helpers({
    selections: function () {
        var selected = this.valuationSelections;
        return Companies.find({ticker: {$in: selected}})
    },
    valuationNum: function() {
        var valuationMetric = Template.parentData(1).valuationMetric;
        switch (valuationMetric) {
            case "EV/Revenue":
                return this.enterpriseValue.toFixed(1);
                break;
            case "EV/EBITDA":
                return this.enterpriseValue.toFixed(1);
                break;
            default:
                return "";
        }
    },
    valuationDen: function() {
        var valuationMetric = Template.parentData(1).valuationMetric;
        var valuationPeriod = Template.parentData(1).valuationPeriod;
        switch (valuationMetric) {
            case "EV/Revenue":
                switch (valuationPeriod) {
                    case "LTM":
                        return this.ltm.revenue.toFixed(1);
                        break;
                    case "FY1":
                        return this.fy1.revenue.toFixed(1);
                        break;
                    case "FY2":
                        return this.fy2.revenue.toFixed(1);
                        break;
                }
                break;
            case "EV/EBITDA":
                switch (valuationPeriod) {
                    case "LTM":
                        return this.ltm.ebitda.toFixed(1);
                        break;
                    case "FY1":
                        return this.fy1.ebitda.toFixed(1);
                        break;
                    case "FY2":
                        return this.fy2.ebitda.toFixed(1);
                        break;
                }
                break;
            default:
                return "";
        }
    }
});

Template.registerHelper('divide', function(a, b) {
    return (a / b).toFixed(1);
    });

<template name="ValuationTable">
    {{#each selections}}
        <tr>
            <td>
                <a>${{valuationNum}}</a>
            </td>
            <td>
                <a>${{valuationDen}}</a>
            </td>
            <td>
                <a>{{divide valuationNum valuationDen}}x</a>
            </td>
        </tr>
    {{/each}}
</template>
Template.ValuationTable.helpers({
选择:函数(){
所选var=此。估价选择;
返回公司。查找({ticker:{$in:selected}})
},
evaluationnum:function(){
var valuationMetric=模板.parentData(1).valuationMetric;
开关(估价度量){
案例“EV/收入”:
将此.enterpriseValue.toFixed返回(1);
打破
案例“EV/EBITDA”:
将此.enterpriseValue.toFixed返回(1);
打破
违约:
返回“”;
}
},
赋值den:function(){
var valuationMetric=模板.parentData(1).valuationMetric;
var valuationPeriod=Template.parentData(1).valuationPeriod;
开关(估价度量){
案例“EV/收入”:
转换(估价期){
案例“LTM”:
将此.ltm.revenue.toFixed返回(1);
打破
案例“FY1”:
将该.fy1.收入返回固定(1);
打破
案例“FY2”:
将该.fy2.收入返回固定(1);
打破
}
打破
案例“EV/EBITDA”:
转换(估价期){
案例“LTM”:
将该.ltm.息税折旧摊销前利润返回固定(1);
打破
案例“FY1”:
将本财年的息税折旧摊销前利润返回固定(1);
打破
案例“FY2”:
将本财年的息税折旧摊销前利润返回固定(1);
打破
}
打破
违约:
返回“”;
}
}
});
Template.registerHelper('divide',函数(a,b){
返回(a/b)。固定(1);
});
{{{#每项选择}
${{valuationNum}
${{valuationDen}
{{divide valuationNum valuationDen}}x
{{/每个}}
然后,我需要计算第三个值系列的平均值和中值,以显示在页面上并用作D3的数据点。我知道我需要数组中的这些值来计算平均值和中值,但我不知道如何从助手结果中“获取”它们

首先,我应该在对象中构建开关(可能在订阅中?)并将其传递给助手吗?如果是这样,请提供任何指导

第二,如何获得要添加到数组中的第三个值?我可以直接从助手处访问它吗

提前谢谢,如果这是两个不同的问题,很抱歉,我认为它们是密切相关的

编辑:


根据Michel关于meteorhacks:aggregate的建议,我意识到我的想法是错误的,需要聚合,而不是助手。

在处理单个文档的助手函数中执行聚合操作是不切实际的。您可能会发现一个包,例如用于实现聚合函数的包


为什么不切实际?首先,由于反应性,任何值甚至文档的数量都可能随时发生变化。您不能真正执行聚合,因为文档显示在具有一个文档范围的函数中。

谢谢-您是说我需要使用聚合函数进行任何数学计算吗?其中一些只是除法和乘法,我认为没有必要(我也不知道如何使用它们)。我是开发新手,所以我甚至不确定这里的问题是针对Meteor还是Javascript。聚合在多个文档上执行函数时非常有用。简单除法(分子/分母)取两个数字,如果两个数字来自同一文档,则可以在助手中执行(一次一个文档-此值)。您的平均值和中位数需要所有文档,因此需要汇总。你的问题比javascript更像流星,因为它涉及blaze模板和帮助函数。非常感谢-需要花一些时间学习,希望你不介意我等到它工作后再接受答案!当然可以学习流星的好处是它能很快地回报你。米歇尔,这让我找到了正确的答案。我在聚合方面遇到了一些问题,但我将单独发布,以避免混淆原始问题。谢谢