3

次のデータ、オブジェクトの配列があります。

var data = [
    { x: 0, y0: 0, y: 100 },
    { x: 1, y0: 0, y: 150 },
    { x: 2, y0: 50, y: 100 },
    { x: 3, y0: 50, y: 150 }
]

D3 を使用して、yとの間に最大の不一致があるオブジェクトを見つけたいと思います。y0

最大の違いを得るためにこれを行うことができます:

var max_val = d3.max(data, function(d) { return d.y - d.y0;} );

それは 150 を返します。しかし、どうすればそれを含んでいるオブジェクトを取得し、x の対応する値が 1 であることを学習できるかわかりません。

何か案は?

4

3 に答える 3

4

あなたの質問はd3.max、このオブジェクトを見つけるために使用する方法を尋ねますが、別のアイデアは、Javascript 配列のsort関数を使用してこれを行うことです。

>>> data.sort(function(a, b){ return (b.y - b.y0) - (a.y - a.y0); } )[0]
Object {x: 1, y0: 0, y: 150}

ここではdata、2 つのオブジェクトaおよびが与えられ、それらのおよびプロパティbの違いを使用してそれらを比較する関数を使用して並べ替えています。fromの値を減算することで、オブジェクトを降順で返し、最初のオブジェクトを取得します。yy0ab

于 2013-10-10T19:00:00.333 に答える
1

現在、純粋に d3 でこれを行う良い方法はないと思います。d3 docs から、次のように述べています。

自然順序を使用して、指定された配列の最大値を返します。配列が空の場合、undefined を返します。オプションのアクセサー関数を指定できます。これは、最大値を計算する前に array.map(accessor) を呼び出すことと同じです。

ソースコードを調べて、d3.max の計算方法を確認しました。

    d3.max = function(array, f) {
    var i = -1, n = array.length, a, b;
    if (arguments.length === 1) {
      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;
      while (++i < n) if ((b = array[i]) != null && b > a) a = b;
    } else {
      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
    }
    return a;
  }

これは、アクセサー関数が値自体を返すという事実によるものです。おそらくオブジェクトを返すようにカスタマイズできますが、d3.max は特に数値を処理します。

他の人が述べているように、純粋な Javascript でこれを処理する方法は他にもあります。

関連する質問: ドメインが D3 で d3.max(data) を使用しないのはなぜですか?

于 2013-10-10T19:43:02.507 に答える
0

d3 を使用せずに、標準の array.reduce 関数を使用してこれを見つけることもできます。

var highestDiscrepencyObject = data.reduce(function(memo, val){
  var dis = val.y - val.y0,
      memoDis = memo.y - memo.y0;

  return (dis > memoDis || memo.y === undefined) ? val : memo;
}, {});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

于 2013-10-10T19:25:53.010 に答える