2015-10-13 4 views
-1

Привет У меня есть массив, который выглядит так.кумулятивное суммирование/сортировка javascript

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'}, 
] 

Важно то, что массив должен быть отсортирован по идентификатору, а затем общий рассчитываются на Deb - CRE + в общей сложности от предыдущего ряда.

В настоящее время я использую d3 в своей настройке, но я не смог найти подходящее решение для этого, вычисленное значение не сохраняется на правильном объекте, возможно, потому, что сортировка не соответствует внутри цикла ,

поэтому, если для этого используется чистое решение с помощью d3, я был бы очень доволен, потому что тогда я мог бы легко использовать карту или ключ, если позже добавлю другие атрибуты.

спасибо.

Редактировать

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

одна проблема состоит в том, что он, кажется, не будет сделано в порядке, мне нужно, и используя этот способ, у меня нет простого способа сопоставить его с d3.js, поэтому я предпочел бы использовать это решение.

+0

сообщение код, который вы написали, чтобы попытаться это и объяснить, что определенная часть не работает. – csmckelvey

+0

Добро пожаловать на http://stackoverflow.com. Мы любим помогать людям при условии, что мы увидим, что они уже внедрили –

+0

downvotes .. действительно ?? – Stellan

ответ

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

Смежные вопросы