假设我有以下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});
但我不喜欢这种方法,因为我不想改变数据。我宁愿使用一些外部上下文或范围来实现这一目标。有可能吗?
答案 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"
/>
虽然如果是我,我可能会像以前那样改变数据 - 它可以避免担心索引是否会移动,或者你是否正确地声明了对象。