2016-08-22 76 views
2

我試圖在兩個變量cx(應該是一年中的一天)和cy(應該是小時+分鐘/ 60)根據:d3.min.js給出未捕獲的TypeError:n.apply不是函數

<!-- date format of d.date: 24-8-2016 9:47:38--> 
      var parseDayinYearFormat = d3.time.format('%j').parse; 
      var parseHourFormat = d3.time.format('%H').parse; 
      var parseMinuteFormat = d3.time.format('%M').parse; 

      <!-- add the objects--> 
      var circles = svg.selectAll("circle") 
       .data(data) 
       .enter() 
       .append("circle"); 
      var circleAttributes = circles 
       .attr("cx", function (d) { return +parseDayinYearFormat(d.date); }) 
       .attr("cy", function (d) { return +parseHourFormat(d.date)+(parseMinuteFormat(d.date)/60); }) 
       .attr("r", function (d) { return 20.0/(9-d.total); }) 
       .attr("class", function (d) {if (d.w>d.total-d.w) {return "cr"} else { return "cb" }}); 

但D3是不是在玩漂亮:Cx和Cy成爲楠D3是給錯誤遺漏的類型錯誤:n.apply不是一個函數

請幫助。

+0

我建議下載未縮小的d3.js文件並將其插入代碼中。當它引發錯誤時,請查看瀏覽器開發工具中的源代碼。 –

+0

會嘗試Eric。 – Rense

回答

2

您需要使用單個格式對象解析整個字符串。你不能用一系列解析來解析字符串。

使用d3 version 3.x documentation我想出了以下內容,它適用於您的示例。

var datestring = '24-8-2016 9:47:38'; 
 
var format = d3.time.format('%-d-%-m-%Y %-H:%-M:%-S'); 
 

 
console.log(format.parse(datestring)) 
 
// "2016-08-24T13:47:38.000Z" // (my time zone is UTC-4)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

注意,因爲你的榜樣24-8-2016 9:47:38有許多領域,顯示沒有零填充,我用的是%和符之間的破折號,即%-d,告訴D3,有可能一開始就不是零。

另外請注意,在你的榜樣,有沒有辦法24是一天的一年,這是1和366之間:24顯然只是的一天吧?

但是,從您的代碼片段看來,您只是想從字符串中提取日期和時間以及分鐘。爲了這個簡單的目的,d3.time.format可能是矯枉過正,因爲它給了你一個Date對象,然後你必須解析以提取日/小時/分鐘。考慮爲此任務使用正則表達式。

+0

感謝您的快速回答。但爲了做數學,我確實需要小時和分鐘。至於24這確實是一個月的一天,但我需要它在1..366範圍內轉換。 – Rense

+0

好吧,你可以使用'Date'的方法,例如'GetHours'來提取你需要的數字(測試以確保你不會受到本地時區與UTC的錯誤攻擊),或者你可以使用'd3 .time.format'。看看http://stackoverflow.com/q/8619879/500207,它看起來像使用d3將Date對象轉換爲一年中的某一天(1-366)將會非常容易:'+ d3.time.format (「%j」)(format.parse(datestring))'評估爲'237'。 –

相關問題