嗨,我有一个看起来像这样的数组。
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.id
和b.id - a.id
答案 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;
});