2014-08-29 91 views
3

我從D3.js嵌套功能中得到一些奇怪的行爲,好像密鑰和彙總將test_date從Date對象轉換爲字符串。D3嵌套格式錯誤的日期

這裏是我的代碼:

var data = [{ 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}, { 
    "test_type": "x3", 
    "test_date": "2014-07-16" 
}, { 
    "test_type": "x2", 
    "test_date": "2014-07-27" 
}, { 
    "test_type": "x1", 
    "test_date": "2014-07-28" 
}]; 

var parseDate = d3.time.format("%Y-%m-%d").parse; 


data.forEach(function(d) { 
    d.test_date = parseDate(d.test_date); 
}); 

var result = d3.nest() 
    .key(function(d) { 
     return d.test_type; 
    }) 
    .key(function(d) { 
     return d.test_date; 
    }) 
    .rollup(function(leaves) { 
     return leaves.length; 
    }) 
    .entries(data); 

,其結果是:

[{ 
    "key": "x1", 
    "values": [{ 
     "key": "Tue Jul 15 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }, { 
     "key": "Mon Jul 28 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}, { 
    "key": "x3", 
    "values": [{ 
     "key": "Wed Jul 16 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}, { 
    "key": "x2", 
    "values": [{ 
     "key": "Sun Jul 27 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}] 

我需要的嵌套的鍵值是日期的對象不是字符串。有沒有人知道這會導致什麼?

這裏是問題http://jsfiddle.net/2ryahc9L/1/

+0

恐怕這不是「不正確」的行爲 - 它是如何定義的方法,[鍵總是被視爲字符串](https://github.com/mbostock/d3/ wiki/Arrays#nest_key)(與JavaScript對象或d3.map hashmap相同,它們在內部用於創建嵌套)。通常,我會建議從values數組中的第一個條目訪問原始數據值,但彙總功能會刪除該選項。這並不理想,但您應該能夠將字符串強制退回到一個日期而不會丟失數據。 – AmeliaBR 2014-08-29 22:13:04

+0

謝謝你的迴應。這就是我最終做的。 – 2014-08-29 22:13:39

回答

3

的函數(對象)兩種方式d3.time.format工作的jsfiddle:

  • d3.time.format('%Y-%m-%d').parse('2014-08-29')將返回Date對象。它使用格式來知道如何解釋作爲參數給出的字符串。
  • d3.time.format('%Y-%m-%d')(new Date(2014, 7, 29))將返回字符串,格式爲2014-08-29'

此外,d3.nest中的密鑰總是被強制爲字符串。你將需要結合兩種形式來獲得所需的行爲。問候。

0

我發現了一個解決方案,確實對我有效。我有類似的問題。 我想用時間戳作爲鍵嵌套數據。 AmeliaBR寫道,密鑰是字符串。但是,我想將該鍵用作對象,因爲它應該是我的圖表的x軸。

var data = [{ 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}, { 
    "test_type": "x3", 
    "test_date": "2014-07-16" 
}, { 
    "test_type": "x2", 
    "test_date": "2014-07-27" 
}, { 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}]; 

var parseDate = d3.time.format("%Y-%m-%d").parse; 

我使用日期另一場只針對嵌套數據而不解析數據,日期/時間的關鍵。

data.forEach(function(d) { 
    d.key_date = d.test_date; 
    d.test_date = parseDate(d.test_date); 
}); 

var result = d3.nest() 
    .key(function(d) { 
     return d.key_date; 
    }) 
    .rollup(function(leaves) { 
     return leaves.length; 
    }) 
    .entries(data); 

result我又test_date添加爲對象,因爲key_date是一個字符串。

result.forEach(function(d) { 
    d.test_date = parseDate(d.key); 
}); 

我不知道,如果這是一個好辦法做到這一點。 如果沒有,請諮詢。 謝謝...

+0

這不是一個好主意。它只是提出了問題,因爲你的鑰匙也是字符串。更糟的是,因爲你迭代了'result'來解析日期。我建議你把第一個'.forEach'完全轉儲出來,像你的嵌套一樣使用'test_date'字符串,然後進行解析。 – altocumulus 2017-02-16 12:05:29

+0

我知道在'result'上迭代兩次並不是一個好主意。但我需要'數據'作爲進一步處理。我會聽取您的建議並考慮更好的解決方案。謝謝。 – 2017-02-16 12:15:53

+0

我找到了更好的解決方案。我在我的sql語句中進行彙總。無論如何,似乎更快。 – 2017-02-19 11:24:24