【问题标题】:d3 reduce method is returning NaNd3 reduce 方法返回 NaN
【发布时间】:2015-05-16 23:14:47
【问题描述】:

更新: 添加了JSFIDDLE,并且我更新了此帖子中的原始值以匹配。小提琴不起作用,因为 csv 是外部的。 I tried this,但想不通。但是,至少你可以看到代码。

在我的机器上,第 52-54 行的控制台日志显示:

dateArray ["10/17/0014", "10/18/0014", "10/20/0014", "10/21/0014"]
frequencyArray [3, 3, 4, 2]
cumulativeFrequencyArray [3, 6, 10, 12]

当滑块位于 2014 年 10 月 19 日时,我希望它显示 0 和 6。这几乎就像我需要以某种方式识别没有数据的日期,或者:

  1. 将零推入frequencyArray?
  2. 或者我需要cumulativeFrequencyArray 来显示它之前的索引?

我也不喜欢两次访问外部 csv 文件的方式,但这是另一个问题 :) 谢谢!

原文: 使用 D3,我有一个日期的 csv:

timeStamp
10/17/14 02:20:15 PM
10/17/14 08:22:35 AM
10/17/14 09:03:18 AM
10/18/14 02:20:15 PM
10/18/14 08:23:35 AM
10/18/14 09:03:18 AM
10/20/14 08:23:35 AM
10/20/14 10:23:35 AM
10/20/14 02:20:15 PM
10/20/14 02:03:18 AM
10/21/14 04:20:15 PM
10/21/14 09:03:18 AM

我正在制作一个找到的日期数组

dateArray = ['10/17/14', '10/18/14', '10/20/14', '10/21/14']

我正在计算找到的每个日期的出现次数,并将它们放入另一个数组中

frequencyArray = [3, 3, 4, 2];

我还在frequencyArray 上使用reduce() 来生成先前总和的第三个数组

cumulativeFrequencyArray = [3, 6, 10, 12];

我正在使用日期滑块来显示 frequencyArraycumulativeFrequencyArray 值的文本(当我滑动到 2014 年 10 月 21 日时,文本显示“2”和“12”)。我这样做是说 - “当滑块值等于 dateArray 中的值时,显示相应的 indexOf frequencyArraycumulativeFrequencyArray

这很有效,直到您滑动到没有值的日期,例如 10/19/14,它显示“NaN”和“NaN”。美好的。因此,如果没有找到日期,请将 NaN 设为零

frequencyArray[indexOfFormattedCurrentDate] = frequencyArray[indexOfFormattedCurrentDate] || 0;

但是,文本显示的不是“0”和“6”,而是“0”和“NaN”。它很好地将 frequencyArray 文本设为零,但仍将 NaN 置于 cumulativeFrequencyArray 文本中。

我怎样才能得到cumulativeFrequencyArray 文本来放置先前值的总和?

谢谢。

【问题讨论】:

  • 您的控制台是否出现任何错误?我相信您在设置dates.indexOf(currentDate) = dates.indexOf(currentDate) || 0; 时会收到Invalid left-hand side in assignment 错误。你能提供其余的代码吗?更好的是,jsfiddle?
  • 谢谢@Dom。不,没有控制台错误。请参阅上面的更新。谢谢!
  • 请不要有“更新”部分。它使阅读帖子变得困难。将其全部重写为一篇连贯的帖子。

标签: javascript arrays date d3.js reduce


【解决方案1】:

由于以下原因,您会得到 NaN:

var index = dateArray.indexOf('a date that does not exist')   // -1
var el = cumulativeFrequencyArray[index]                      // undefined 
thousandSeparator(el)     // 'NaN' note that it's a string 'NaN', not the numeric NaN

您应该进行线性搜索,直到找到元素或找到更大的日期而不是 indexOf,我建议将日期解析为数字而不是将它们作为字符串处理

【讨论】:

  • 感谢您的洞察力。对,我应该将日期解析为数字,这样会更好!如果我这样做,我现在想知道getting a zero into the array where no date is found 是否会更好。我想以此构建时间序列图形,因此在第一个和最后一个之间的每个日期都有一个值是理想的。在这种情况下,csv 是 20,000 行。那么,这有意义吗?
  • 这不是原始问题的一部分,但它真的取决于你需要做什么,如果你不关心额外的空间,你可以有一个空元素用于不在行或使用二进制搜索查找一天的位置
  • 谢谢。是的,抱歉,这是一个附加问题。我会看看你建议的那些选项,如果我有更多问题,我会再写一篇文章。您确实回答了我最初的问题,所以我将其标记为已回答。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多