2014-08-08 2 views
0

Я пытаюсь перебрать массив объектов и добавить похожие свойства по дате и вернуть новый массив с суммированными данными. Вот пример:Как суммировать значения свойств объекта по дате в JavaScript

Данные ниже для каждого дня недели, я хотел бы получить сумму телевидения, видео и DVD за месяц. Каждый блок кода будет иметь отметку даты.

var i = [ 
    { 
     "0":{ 
     "TV":"200", 
     "Video":"50", 
     "DVD":"150", 
     "Date":"Fri Jul 18 2014 19:00:00 GMT-0500" 
     } 
    }, 
    { 
     "1":{ 
     "TV":"150", 
     "Video":"60", 
     "DVD":"150", 
     "Date":"Fri Jul 25 2014 19:00:00 GMT-0500" 
     } 
    }, 
    { 
     "2":{ 
     "TV":"350", 
     "Video":"20", 
     "DVD":"150", 
     "Date":"Wed Aug 01 2014 19:00:00 GMT-0500" 
     } 
    }, 
    { 
     "3":{ 
     "TV":"200", 
     "Video":"50", 
     "DVD":"100", 
     "Date":"Thurs Aug 08 2014 19:00:00 GMT-0500" 
     } 
    } continues..... 
] 

Ниже приведен метод, который я работаю над ...

var newObj = []; 
for(var key in i){ 
var thisMonth = i[key].Date.getMonth(); 
if(thisMonth === 6){ 
    //Add each properties together and push to the new array 
    console.log(thisMonth); //this results in two 6 (july). 


}else if(thisMonth === 7){ 
    //Add each properties together and push to the new array 
    console.log(thisMonth); //this results in two 7 (August). 

} 
} 
return newObj; 

То, что я хотел бы этот метод возвращает новый массив со всеми суммированными данными.

[ 
    { 
     "0":{ 
     "TV":"350", 
     "Video":"110", 
     "DVD":"300", 
     "Date":"Jul 2014" 
    },{ 
     "0":{ 
     "TV":"550", 
     "Video":"70", 
     "DVD":"250", 
     "Date":"Aug 2014" 

    ] 

Может быть, лучше подходить к этому, я ценю любые советы. Заранее спасибо!

+0

С какой проблемой вы сталкиваетесь? – Nit

+0

Вот что вам поможет: http://jsbin.com/tucat/1/edit – elzi

+0

Являются ли входные и выходные данные действительно массивами * двойных обернутых объектов, или это просто причуда ручной сериализации? Было бы более обычным видеть простые массивы объектов. –

ответ

0

Ниже никогда бы не работал

i[key].Date.getMonth(); 

Как ваш Date собственность была бы строка, а не объект Дата, так что бы остановлен из-за неопределенной ошибки функции.

Приведенное ниже будет накапливать данные, но вместо того, чтобы иметь объект с единственным свойством с именем «0», содержащий данные, это создаст объект со свойствами {month} {year}, то есть Aug 2014, июль 2014 года, где данные содержащиеся

var data = {}; 

//Loop over the array, use a regular for loop or 
//forEach polyfill if supporting older browsers 
i.forEach(function(item,index){ 
    //Since the object we want is a property 
    //of the item object use the index as the key 
    var obj = item[index]; 
    var d = new Date(obj.Date); 

    //alternative way to get abbr. month then creating 
    //an array of months and using the getMonth as an index to that array 
    var m = d.toDateString().split(" ")[1]; 
    var y = d.getFullYear(); 

    //Check to see if there already is a month/year 
    //property creating one if not. 
    var temp = data[m+" "+y] || {"TV":0,"Video":0,"DVD":0,"Date":""}; 

    temp.TV += +obj.TV; 
    temp.Video += +obj.Video; 
    temp.DVD += +obj.DVD; 
    temp.Date = m+" "+y; 

    data[m+" "+y] = temp; 
}); 
console.log(data); 

будет регистрировать объект данных, и будет иметь следующий формат:

{ 
    "Jul 2014": { 
     "TV": 350, 
     "Video": 110, 
     "DVD": 300, 
     "Date": "Jul 2014" 
    }, 
    "Aug 2014": { 
     "TV": 550, 
     "Video": 70, 
     "DVD": 250, 
     "Date": "Aug 2014" 
    } 
} 

JSFiddle Demo

+0

В качестве объекта выход будет беспошлинным, что может быть проблемой. В Javascript только массивы имеют порядок. –

+0

Wow Patrick! спасибо, что поставили это вместе для меня. Могу ли я работать с этим также в цикле. Кажется, что свойство Date не работает для меня, когда я пытаюсь использовать его для цикла forEach – habibg

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