2016-08-19 65 views
1

按日期對對象進行分組並將它們全部添加以創建單個JavaScript對象的最佳方法是什麼?由於應用程序不是數據密集型的,我更喜歡代碼可讀性和較低的代碼行數。此外,在完成實習後,將會有很多人要做出改變。在JavaScript中按日期分組和總計DateTime對象

下面是一些樣本數據

[ 
    {"Timestamp":"Thu, 01 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 01 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 03:57:00 GMT","cp":0,"pc":4}, 

    {"Timestamp":"Thu, 02 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 02 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 03:57:00 GMT","cp":0,"pc":4} 

] 

我想創建了這一點上面的數據。

[ {"Date":"2015-01-01", "cp":4, "pc":12}, {"Date":"2015-01-02", "cp":4, "pc"12} ] 

如果您發現,得到的JavaScript對象是總和在那個特定日期的所有列,並通過之日起代替時間戳。

我們已經在應用程序中使用了moment.js,所以我可以使用它。如果您認爲時刻可以以更簡潔的方式解決問題,請告訴我。

回答

2
  • 迭代你的對象的陣列($.each()函數可用於任何集合遍歷。)
  • 使用toISOString()方法轉換UTC格式日期字符串ISO格式。
  • 維護日期的通用數組,以便您可以使用indexOf()方法輕鬆映射重複的日期位置。

這裏是代碼:

var arr = [ 
    {"Timestamp":"Thu, 01 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 01 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 03:57:00 GMT","cp":0,"pc":4}, 

    {"Timestamp":"Thu, 02 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 02 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 03:57:00 GMT","cp":0,"pc":4} 
]; 
var resultArr = []; 
var dateArr = []; 

$.each(arr, function() { 
// Easiest way to get your required date format 
    var date = new Date(this.Timestamp).toISOString().replace(/T/, ' ').split(' ')[0]; 
    if (dateArr.indexOf(date) == -1) { 
     dateArr.push(date); 
     var obj = {Date: date, cp: this.cp, pc: this.pc}; 
     resultArr.push(obj); 
    } 
    else { 
     resultArr[dateArr.indexOf(date)].cp += this.cp; 
     resultArr[dateArr.indexOf(date)].pc += this.pc; 
    } 
}); 
console.log(resultArr); // [ {"Date":"2015-01-01", "cp":4, "pc":12}, {"Date":"2015-01-02", "cp":4, "pc"12} ] 

但願這對你有幫助。

+0

謝謝:)。我得到這個Uncaught TypeError:$ .each不是函數(...)(匿名函數) –

+0

我認爲你與'$'有衝突。你可以使用'jQuery'而不是'$' – Jeni

+0

現在就可以了。謝謝。 –

1

我相信一個簡單的實用程序庫(如Underscore.jsLodash)可以完成這項工作,但是,這看起來像是一個普通的舊vanilla Javascript本身可以完成的任務。

檢查出Array.prototype.map函數,或者更好的是Array.prototype.sort,該函數接受一個排序函數,將邏輯應用於給定對象的.Timestamp屬性。

編輯:像

yourArray.sort(function(objA, objB){ 
    return objA.Timestamp > objB.TimeStamp ? -1 : 1; 
}); 

東西可能工作。

編輯:我看到你現在正在嘗試合併日期。在這種情況下,我會說Array.prototype.mapArray.prototype.reduce鏈接是可能的下降路徑。您也可以(混亂地)使用Array.prototype.filter將給定日期的所有數組推送到單個數組中,以此類推。

編輯:

如何減少呢?

var thingYouWant = yourArray.reduce(function(summed, current){ 
    date = changeIntoOnlyDayDate(current.Timestamp); 
    var found = false; 
    summed.forEach(function(obj){ 
     if(obj.Timestamp === date){ obj.cp++; found = true;}; 
    } 
    if(!found){summed.push(turnThisDateIntoDesiredObject(date))} 

    } 
    return summed; 
    }, []); 
+0

您提供的代碼無法解決我的問題。我想分組並將它們全部添加。我不想排序。說入口1,2,3和4是在1月1日製作的,我想把它們加到1月1日的總數上。 –

+0

我在編輯我的答案,一會兒就會看到。 –

+0

我從來沒有想過減少和過濾。爲此贊成。我最終使用了Jeni的答案,因此我不接受你的解決方案。 :) –

1

試試這個。

var timeArray=[ 
    {"Timestamp":"Thu, 01 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 01 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 01 Jan 2015 03:57:00 GMT","cp":0,"pc":4}, 

    {"Timestamp":"Thu, 02 Jan 2015 00:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 01:57:00 GMT","cp":0,"pc":4}, 
    {"Timestamp":"Thu, 02 Jan 2015 02:57:00 GMT","cp":2,"pc":2}, 
    {"Timestamp":"Thu, 02 Jan 2015 03:57:00 GMT","cp":0,"pc":4} 
] 

var object = {}, resultArray = []; 

for (var i = 0; i < timeArray.length; i++) { 
    var date = timeArray[i].Timestamp; 
    var localDateString = new Date(date).getFullYear() + '-' + (new Date(date).getMonth() + 1) + '-' + new Date(date).getDate(); 
    if (object[localDateString]) { 
     object[localDateString].cp += timeArray[i].cp; 
     object[localDateString].pc += timeArray[i].pc; 
    } else { 
     timeArray[i].Date = localDateString; 
     delete timeArray[i].Timestamp; 
     object[localDateString] = timeArray[i]; 
    } 
} 

for (var prop in object) 
    resultArray.push(object[prop]); 

console.log(resultArray); 
+0

這工作。可能需要改變一下以滿足我的需求。非常感謝。如果我沒有得到更好的解決方案,我會接受解決方案:) –