1

我正在尝试制作一些可以显示成绩的东西,我需要从一系列作业中计算分数。

好的,我有一个这样的数组:

[{
    category: "assignment",
    date: 2/13/13,
    earned: 9,
    total: 10
}, {
    category: "assignment",
    date: 2/13/13,
    earned: 8.5,
    total: 10
}, {
    category: "test/quiz",
    date: 2/7/13,
    earned: 85,
    total: 100
}]

日期不一定按顺序排列,同一天可能有多个数据点

以及不同类别的权重:

[{
    "assignment": 40,
    "test/quiz": 60
}]

我需要的是创建一个新的数组数组,其中每个对象包含截至该点和日期的总体加权等级。(我知道加权是如何工作的

所以这个输出将是:

[   //  [x, y]
    ["2/7/13", 87.5],
    ["2/13/13", 86.0]
]

最好按时间顺序

我感到困惑的是如何以编程方式组合一天的多个作业并将它们与以前的数据组合并创建一个新点。这只是一个简单的例子,通常有很多很多的任务来自几个月的时间

我试过了,但它包含的循环似乎太多了,而且非常混乱,所以我把它刮掉了。我在想一定有更好的方法来做到这一点,至少简单一些。

数据非常灵活,因此可以以任何方式排列。前任。如果那更容易,日期可以更改为时间戳。或者可以将对象属性命名为不同的名称。

我可能会超前,但最终我会在第一次运行时存储数据,然后每隔一次运行检查数据的变化并只计算那些新点

4

1 回答 1

1

这样的事情怎么样?不确定我是否完全理解,但这是我的尝试:

var scores = [{
    category: "assignment",
    date: '2/13/13',
    earned: 9,
    total: 10
}, {
    category: "assignment",
    date: '2/13/13',
    earned: 8.5,
    total: 10
}, {
    category: "test/quiz",
    date: '2/7/13',
    earned: 85,
    total: 100
}];

var weights = {
    "assignment": 40,
    "test/quiz": 60
};

function calculateCombined() {
    var dates = [], combined = [];
    for (var i = 0; i < scores.length; i++) {
        if (!dates[scores[i].date]) {
            dates[scores[i].date] = [];
        }

        dates[scores[i].date].push({
            weight: weights[scores[i].category] || 1,
            percentage: (scores[i].earned / scores[i].total) * 100
        });
    }

    for (var x in dates) {
        if (dates.hasOwnProperty(x)) {
            var tWeight = 0;
            dates[x].forEach(function(dVal) {
                tWeight += (dVal.weight / 100) * dVal.percentage
            });

            combined.push({
                date: x,
                wight: tWeight
            });
        }
    }

    return combined.sort(function(d, e) {
        return new Date(d.date) - new Date(e.date);
    });
}

console.log(calculateCombined());
于 2013-03-13T08:25:33.317 回答