2016-10-05 10 views
0

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仕様をサポートしていないことが原因で発生する可能性がある、わずかに異なるスコープ動作をしていると感じています。

誰もが考えていますか?

答えて

0

私はこの問題を発見しました。最初のb = f(array[i], i, array)呼び出しbの後は、数値と全く同じには比較できないオブジェクトになります。 d.timeからNumberにキャストすると問題が解決しました。私のJavaScriptタイピングの経験はありません。

var x = d3.scaleLinear() 
    .range([0, width]) 
    .domain(d3.extent(data, function(d) { return Number(d.time); })); 
+0

これは問題ではありません。つまり、同じ入力が与えられれば、2つのエンジンは同じ出力を生成するはずです。 – Julian

関連する問題