【问题标题】:D3js sorting issue on transition applied应用过渡时的 D3js 排序问题
【发布时间】:2012-09-01 15:51:23
【问题描述】:

我有一个数据集已经通过d.id绑定到svg:g

var categorized = g1.selectAll("g.node")
                    .data(dataset, function(d){return d.id})
                    .classed('filtered', false);
categorized.enter()
           .append("g")
           .attr("class", "node")
...

我使用一个函数从这样的数据值中对其进行排序:

var sorted = dataset
                 .filter(function(d) { return d.notation[3].value >=50 } )
                 .sort(function(a, b) { return d3.descending(a.notation[3].value,
                                        b.notation[3].value) });

当我console.log它时它返回正确的顺序

var filtered = g1.selectAll("g.node")
                 .data(sorted, function(d) {return d.id})
                 .classed('filtered', true);

如果我console.log它,仍然是正确的顺序, 但如果我应用延迟,它会反转结果顺序

scored.transition()
      .delay(500).duration(1000)
      .attr("id", function(d) {
          console.log(d.id);
      });

但如果我消除延迟,它会保持良好的排序。

我的问题:我做错了什么吗?

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    我认为您观察到 d3.js 通常使用反向迭代的“优化”for 循环(请参阅 Are loops really faster in reverse? 以及其他参考资料)。

    简单地反转您的选择是否可行?我不确定您正在转换什么,因此您需要按特定顺序应用补间步骤。

    【讨论】:

    • 感谢您的回答。我确实尝试过反转它,因为我也在不需要反转的列表中使用它......因为它没有延迟。在这一点上,我不想过多地调整我的代码。现在我正在毫不拖延地使用它。但是我仍然想知道这一点以及为什么延迟会使顺序发生变化...您的意思是优化的 for 循环将在延迟 fn 中?
    • 我之前没用过delay。这是否将score 中每个元素的转换错开 500 毫秒,从而使相反的顺序变得明显?我认为它会将所有内容延迟 500 毫秒,然后立即启动它们。优化的 for 循环在 d3 中无处不在。
    • 延迟适用于过渡,实际上它是将圆圈移动到另一个坐标,结果是我的圆圈应该从最好的分数到最低的排序,被颠倒了。是的,它们同时开火。我在其他圈子的退出过渡时间延迟了。
    • 我明白了。您可以在设置坐标的位置发布代码 - 或所有相关代码吗?听起来问题出在其他地方。
    猜你喜欢
    • 2018-03-28
    • 2020-02-22
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2014-05-31
    • 2023-02-21
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多