Java 8組み込みスクリプトインタープリタNashornを使用してd3.jsで生成されたSVGファイルをエクスポートするJavaライブラリを実装しました。私は、d3.extent()関数が適切な最小値/最大値を返さないことに気付きました。何らかの理由で、比較演算子がクロージャー内で正しく機能していません。Java Nashornのd3.extent()を使用した奇妙な動作
私は典型的な方法で広がりと呼ばれる:私は比較をチェックするためにある程度の機能にいくつかのログを追加しました
var x = d3.scaleLinear()
.range([0, width])
.domain(extent(data, function(d) { return d.time; }));
:
var extent = function(array, f) {
var i = -1,
n = array.length,
a,
b,
c;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = array[i]) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null) {
console.log(a + " > " + b + " = " + (a > b));
console.log(c + " < " + b + " = " + (c < b));
if (a > b) {
console.log("a > b");
a = b;
}
if (c < b) {
console.log("c < b");
c = b;
}
}
}
return [a, c];
}
ここNashornからの出力とFirefoxのJavaScriptコンソールがあります:
Nashorn:
-5.553 > 0 = false
-5.553 < 0 = true
c < b
-5.553 > 7.427 = false
0 < 7.427 = true
c < b
-5.553 > 17.6809 = false
7.427 < 17.6809 = false
-5.553 > 26.5069 = false
7.427 < 26.5069 = false
-5.553 > 33.9389 = false
7.427 < 33.9389 = false
-5.553 > 40.325 = false
7.427 < 40.325 = false
JS Console:
-5.553 > 0 = false
-5.553 < 0 = true
c < b
-5.553 > 7.427 = false
0 < 7.427 = true
c < b
-5.553 > 17.6809 = false
7.427 < 17.6809 = true
c < b
-5.553 > 26.5069 = false
17.6809 < 26.5069 = true
c < b
-5.553 > 33.9389 = false
26.5069 < 33.9389 = true
c < b
-5.553 > 40.325 = false
33.9389 < 40.325 = true
c < b
Nashornインタプリタは非常に混乱しています奇数次数。 Nashornは、最新のJavaScript仕様をサポートしていないことが原因で発生する可能性がある、わずかに異なるスコープ動作をしていると感じています。
誰もが考えていますか?
これは問題ではありません。つまり、同じ入力が与えられれば、2つのエンジンは同じ出力を生成するはずです。 – Julian