【问题标题】:What's the increment operator doing here and how it changes the scale?增量运算符在这里做什么以及它如何改变比例?
【发布时间】:2020-07-31 04:02:42
【问题描述】:

上面forEach块内的增量运算符是做什么的,具体来说:

d3.tsv('data.tsv', (err, data) => {
  // clean the data
  data.forEach(d => {
    d.date = new Date(d.date); // x
    ++d[city]; // y`

它是如何改变比例的?

完整代码:Scales and Axes

【问题讨论】:

    标签: javascript d3.js syntax data-visualization data-retrieval


    【解决方案1】:

    这类问题(“这东西在这里做什么?”)有时很难回答,因为我们无法知道作者脑子里想的是什么。但在这种情况下,我相信我有一种预感:作者只是错误地将字符串强制转换为数字。

    您可能知道,TSV 数据被加载并解析为字符串,因此当字段中有数字时,我们必须强制它们。最常见的方式是,在行函数中:

    d.foo = +d.foo;
    return d;
    

    正如您在此演示中看到的,如果您只是执行+d.foo,则该对象不会发生任何事情:

    const obj = {
      value: "42"
    };
    +obj.value;
    console.log(obj)
    console.log(typeof obj.value)

    话虽如此,我相信该代码的作者刚刚发现,如果您使用前缀增量运算符,您可以更改对象而无需返回它(因为++foo 的行为类似于foo = foo + 1):

    const obj = {
      value: "42"
    };
    ++obj.value;
    console.log(obj)
    console.log(typeof obj.value)

    在这里你可以看到为什么我说不正确:价值正在增加。如果您查看链接的 Blockbuilder 中的数据,您会发现旧金山的所有数字都比 TSV 中的实数大 1 个单位。

    【讨论】:

    • 这让我整天思考如何在不使用任何= 的情况下正确地将字符串转换为数字。我对任何搞砸的表达持开放态度。比赛正在进行中。
    • @altocumulus 我也想到了逗号运算符。
    • 当使用行函数时,与使用前缀增量运算符相比,轴缺少顶部值,为什么不能正确渲染?编辑帖子以添加图片
    • @user1076808 因为增量解决方案不正确:最大值不是 68,而是 67。第二张图像是正确的输出。但是,如果您要问为什么轴没有显示数字 67,这是一个完全不同的问题。我回滚了你的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2015-10-07
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多