2

我有一个 javascript 中的数据列表,如下所示:

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

我正在使用 flot 创建一个绘图,并尝试传递这第三个值以从该点访问超链接。因此,我试图通过使用前两个作为查找键来查找每个列表的第三个值(即[[x,y,hyperlink],[x2,y2,hyperlink2]],单击一个点,然后使用适当(x,y)的查找相应的超链接)

无论如何要这样做,还是我需要将一些 x 和 y 的字典传递给 javascript,然后从查找的两个列表中找到公共变量?在 python 中,我知道您可以x使用 itemgetter 对值进行列表过滤,然后查找与该值对应的链接y。但是我对 js 几乎一无所知,所以可以(x,y)给出一个 ID-ing 的解决方案,或者如果不可能或不建议,那么一个解决方案是获取两个列表(来自 x 和 y vals)并找到一个共同值(如果多个,只有一个,任何人)?

4

3 回答 3

5

您可以使用Array.filter()方法来确定是否有任何元素与提供的 x 和 y 匹配。(请注意,IE.filter()直到版本 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

抱歉,在 js 中没有捷径可以做到这一点,除了遍历列表并找到具有匹配“x”和“y”值的列表。

但是,根据您的列表有多大(以及此列表是否将用于其他用途......),您可以重组数据以使其更有效。例如,做一个类似的结构(假设可能有例如 x1, y1 vs x1, y2)

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

然后您可以立即通过“x”索引跳转到第二个 lvl“y”列表,唯一的循环是有多少“y”值共享相同的“x”值

编辑:

实际上,如果您想在重组数据方面更进一步,您可以执行以下操作:

<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 回答