使用js在列表列表中查找值

时间:2012-06-23 23:44:03

标签: javascript flot

我在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中,我知道您可以使用itemgetter对x值进行列表过滤,然后查找与y值对应的链接。但我对js几乎一无所知,因此可以给出(x,y) ID解的解决方案,或者如果不可能或建议,则可以采用两个(来自x和y值)列表的解决方案共同价值(如果是多个,只有一个,任何人)?

3 个答案:

答案 0 :(得分:5)

您可以使用Array .filter() method来确定是否有任何元素与提供的x和y匹配。 (请注意,IE版本在版本9之前不支持.filter(),但MDN具有您可以包含的a 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/

答案 1 :(得分:2)

抱歉,没有快捷方式在js中执行此操作,只是循环遍历列表并找到具有匹配的“x”和“y”值的那个。

但是,根据列表的大小(以及此列表是否将用于其他内容......),您可以重新构建数据以提高其效率。例如,做一个像(假设可能有例如x1,y1对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]);

答案 2 :(得分:0)

这样的事可能

  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]
          } 
      }
  }