2

次のようなJavaScriptのデータのリストがあります。

[[152, 48, 'http://www.google.com'], 
 [198, 47, 'http://www.stackoverflow.com'], 
 [199, 45, 'http://www.apple.com']]

flot を使用してプロットを作成しており、この 3 番目の値を渡してポイントからハイパーリンクにアクセスしようとしています。そのため、最初の 2 つを検索キーとして使用して、各リストの 3 番目の値を検索しようとしています (つまり、[[x,y,hyperlink],[x2,y2,hyperlink2]]ポイントをクリックし、適切な を使用し(x,y)て対応するハイパーリンクを見つけます)。

とにかくこれを行う必要がありますか、それとも x と y の辞書を javascript に渡し、検索された 2 つのリストから共通変数を見つける必要がありますか? xPythonでは、itemgetterを使用して値に対してリストのフィルタを実行し、値に対応するリンクを検索できることを知っていyます。しかし、私は js についてほとんど何も知らないので、(x,y)与えられた ID の解決策が得られる可能性があります。または、可能でないかアドバイスされていない場合は、(x と y の値から) の 2 つのリストを取得し、共通の値 (複数の場合) を見つける解決策があります。 、たった一人、誰か)?

4

3 に答える 3

5

Array.filter()メソッドを使用して、指定された x と y に一致する要素があるかどうかを調べることができます。.filter()(IE はバージョン 9 までサポートしていませんでしたが、MDN には含めることができるshimがあることに注意してください)。

var data = [[152, 48, 'http://www.google.com'],
            [198, 47, 'http://www.stackoverflow.com'],
            [199, 45, 'http://www.apple.com']];

function getURLForPoint1(x, y) {
    var p = data.filter(function(el) {
        return (el[0] === x && el[1] === y);
    });
    if (p.length === 1) return p[0][2];
    // else 0 or more than 1 elements mathced so return undefined
}

または、事前にディクショナリ オブジェクトを作成し、ディクショナリから将来のルックアップを行うこともできます。

var getURLForPoint2 = function() {
    var dataDictionary = {}, i;
    for (i = 0; i < data.length; i++)
       dataDictionary[data[i][0]+" "+data[i][1]] = data[i][2];

    return function(x, y) {
       return dataDictionary[x + " " + y];
    };
}();

いずれにせよ、リストにないポイントを要求すると返されるようにコーディングしましたundefinedが、明らかにそれを変更して、空の文字列を返すか、例外をスローするか、好きなものをスローできます。

alert(getURLForPoint1(198, 47));    // 'http://www.stackoverflow.com'
alert(getURLForPoint2(198, 47));    // 'http://www.stackoverflow.com'
alert(getURLForPoint2(4, 5));       // undefined

両方のデモ: http://jsfiddle.net/WdSAz/ </p>

于 2012-06-24T00:06:39.023 に答える
2

申し訳ありませんが、リストをループして、一致する「x」と「y」の値を持つものを見つける以外に、js でそれを行う近道はありません。

ただし、リストの大きさ (およびこのリストが別の目的で使用されるかどうか) によっては、データを再構築してより効率的にすることができます。たとえば、次のような構造を実行します (たとえば、x1、y1 対 x1、y2 を持つことが可能であると仮定)

x1 > y1 > url
x1 > y2 > url
x2 > y1 > url
etc...

次に、「x」インデックスによって2番目のレベルの「y」リストにすぐにジャンプできます。ループするのは、同じ「x」値を共有する「y」値の数だけです。

編集:

実際、データを再編成してさらに一歩進めたい場合は、次のようにすることができます。

<script type='text/javascript'>
var list = {
  1 : {
    1 : 'foobar 1,1',
    2 : 'foobar 1,2'
  },
  2 : {
    1 : 'foobar 2,1',
    2 : 'foobar 2,2'
  },
};

</script>

たとえば、これを行うことができます

var x = 1;
var y = 2;
alert(list[x][y]);
于 2012-06-23T23:52:42.627 に答える
1

このようなものかもしれません

  var findX = 198
  var findY = 47
  var targetUrl
  for (var i=0; i<arr.length; i++)
  {
      for (var j=0; j<arr[i].length; j++)
      {
          if (findX = j[0] && findY == j[1])
          {
              targetUrl = j[2]
          } 
      }
  }
于 2012-06-23T23:52:30.830 に答える