如何在D3

时间:2016-03-17 15:24:36

标签: javascript d3.js

假设我有以下D3代码:

var bar = chart.selectAll("g").data(data)
    .enter().append("g")
    .attr("width", function(d) {return calculateValue(d)+1})
    .attr("height", function(d) {return calculateValue(d)*2});

让我们假设calculateValue()函数有点贵。预先计算数据中每个项目的值的最佳方法是什么?

我做了类似的事情来预先计算价值:

var bar = chart.selectAll("g").data(data)
    .enter().append("g")
    .each(function(d) {d._preCalculated = calculateValue(d)})
    .attr("width", function(d) {return d._preCalculated+1})
    .attr("height", function(d) {return d._preCalculated*2});

但我不喜欢这种方法,因为我不想改变数据。我宁愿使用一些外部上下文或范围来实现这一目标。有可能吗?

2 个答案:

答案 0 :(得分:3)

你能不能在每个函数中计算和分配它?

 ...
 .each(function(d) {
     var bigCalc = calculateValue(d);
     d3.select(this)
        .attr("width", bigCalc+1)
        .attr("height", bigCalc*2)
    ;
  })

答案 1 :(得分:0)

如果您只想将数据存储在具有全局范围的变量中,则可以将全局数组设置为数据的索引。

SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);

如果您担心这种情况可能会多次运行(例如,如果您以某种方式刷新图表),您还可以快速检查它是否已经缓存:

        <EditText
            android:id="@+id/text_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hint_login"
            android:textColorHint="#FFFFFF"
            android:imeOptions="actionNext"
            android:singleLine="true"
            android:textColor="#FFFFFF"
            android:drawableBottom="#FFFFFF"
            />

虽然如果是我,我可能会像以前那样改变数据 - 它可以避免担心索引是否会移动,或者你是否正确地声明了对象。