累积求和/排序javascript

时间:2015-10-13 12:06:41

标签: javascript d3.js

嗨,我有一个看起来像这样的数组。

var data = [
    {beb: 200, cre: 0, id: 'A1'},
    {beb: 0, cre: 200, id: 'A2'},
    {beb: 0, cre: 100, id: 'A4'},
    {beb: 0, cre: 100, id: 'A3'},
]

我怎么能看起来像这样?

var newData = [
    {deb: 200, cre: 0, total: 200, id: 'A1'},
    {deb: 0, cre: 200, total: 0, id: 'A2'},
    {deb: 0, cre: 100, total: -100, id: 'A3'},
    {deb: 0, cre: 100, total: -200, id: 'A4'},
]

重要的是,数组需要首先按id排序,然后根据deb-cre计算总数+上一行的总数。

我目前在我的设置中使用了d3,但我还没有找到一个好的解决方案,计算出的总数并没有保存在正确的对象上,可能是因为排序在循环中弄错了。

所以如果使用d3有一个干净的解决方案我会很高兴,因为如果我稍后添加其他属性,我可以轻松使用map或key。

感谢。

修改

var calc = [];
var count = 0;

var newArr = data.sort(function(a, b){
    return a.id - b.id;
})

for(var i = 0; i < newArr.length; i++){
    var item = newArr[i];
    count += item.deb - item.cred
    calc.push({deb: item.deb, cre: item.deb, total: count, id: item.id })
}

对于排序部分,我尝试了a.id - b.idb.id - a.id

这方面的一个问题是它似乎没有按照我需要的顺序完成,并且使用这种方式我没有简单的方法用d3.js映射它所以我更喜欢使用它的解决方案

1 个答案:

答案 0 :(得分:2)

data = data.sort(function(a, b) {
    // to sort by number
    // we need to get the number of the id first
    // if the id will also change the part before the number this will have to be adjusted (just use the search)
    var aid = parseInt(a.id.replace(/[^\d]/, ''), 10),
        bid = parseInt(b.id.replace(/[^\d]/, ''), 10);

    return aid - bid;
}).map(function(d, idx, arr) {
    // now we can calculate the total value

    // previous data entry, or if it is the first round, a fake object
    var previousData = (arr[idx - 1] || {"total": 0});

    // calc the total value
    d.total = (d.beb - d.cre) + previousData.total;
    return d;
});

fiddle