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

Javascript 使用js在列表列表中查找值,javascript,flot,Javascript,Flot,我有一个javascript数据列表,如下所示: [[152, 48, 'http://www.google.com'], [198, 47, 'http://www.stackoverflow.com'], [199, 45, 'http://www.apple.com']] <script type='text/javascript'> var list = { 1 : { 1 : 'foobar 1,1', 2 : 'foobar 1,2' }

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

[[152, 48, 'http://www.google.com'], 
 [198, 47, 'http://www.stackoverflow.com'], 
 [199, 45, 'http://www.apple.com']]
<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>
我正在使用flot创建一个绘图,并试图通过第三个值从该点访问超链接。因此,我尝试使用前两个作为查找键来查找每个列表的第三个值(即,
[[x,y,hyperlink],[x2,y2,hyperlink2]
,单击一个点,然后使用适当的
(x,y)
查找相应的超链接)


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

类似的事情可能是这样的

  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]
          } 
      }
  }
var findX=198
var findY=47
var targetUrl

对于(var i=0;i这样的事情可能

  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]
          } 
      }
  }
var findX=198
var findY=47
var targetUrl

对于(var i=0;i对不起,在js中没有快捷方式来执行此操作,只需循环遍历列表并找到具有匹配的“x”和“y”值的列表即可

但是,根据列表的大小(以及此列表是否将用于其他用途…),您可以重新构造数据以使其更高效

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

编辑:

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

[[152, 48, 'http://www.google.com'], 
 [198, 47, 'http://www.stackoverflow.com'], 
 [199, 45, 'http://www.apple.com']]
<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>

很抱歉,在js中没有快捷方式可以实现这一点,除了在列表中循环并找到具有匹配的“x”和“y”值的列表

但是,根据列表的大小(以及此列表是否将用于其他用途…),您可以重新构造数据以使其更高效

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

编辑:

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

[[152, 48, 'http://www.google.com'], 
 [198, 47, 'http://www.stackoverflow.com'], 
 [199, 45, 'http://www.apple.com']]
<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>
您可以使用来确定是否有任何元素与提供的x和y匹配(请注意,IE在版本9之前不支持
.filter()
,但MDN有您可以包含的元素)

或者,您可以先创建dictionary对象,然后从dictionary中进行后续查找:

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];
    };
}();
演示两个:​

您可以使用来确定是否有任何元素与提供的x和y匹配(请注意,IE在版本9之前不支持
.filter()
,但MDN有您可以包含的元素)

或者,您可以先创建dictionary对象,然后从dictionary中进行后续查找:

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];
    };
}();

演示两个:​

我认为它被称为锯齿数组。据我所知,它是java中常见的多维数组类型。
for…in
循环用于迭代对象属性,可能会对数组造成危险。始终使用
for(var i=0;i为什么有嵌套的循环?单个循环就可以了-请注意,
j
变量不是数组,因此
j[0]
将无法工作。(请注意,您可能打算在
if
中使用
=
(而不是
=
)我认为它被称为锯齿数组。据我所知,它是java中常见的多维数组类型。
for…in
循环用于迭代对象属性,可能会对数组造成危险。始终使用
for(var i=0;i为什么有嵌套的循环?单个循环就可以了-请注意,
j
变量不是数组,因此
j[0]
将无法工作。(请注意,您可能打算在
if
中使用
=
(而不是
=
)请注意,尝试检索
x
坐标不在
列表中的点将产生JS错误,因为
list[x]
将未定义,而您无法执行
未定义[y]
。是的,在使用它之前检查它是否存在是一种很好的做法;这并不是本练习的直接部分……而且有很多方法可以检查它是否存在。我的意思是,对存在的测试将是一个两步过程(我指出这一点是因为它有点繁琐):您必须测试它是否
列表[x]
是在您可以测试是否
列表[x][y]之前定义的
已定义,否则您不仅会返回
未定义的
,还会返回一个JS错误,停止代码执行。但是,是的,如果整个过程都包含在一个访问器函数中,那么该函数显然会处理此问题……请注意,尝试检索
x
坐标不在
列表中的点e> 将给出一个JS错误,因为
list[x]
将是未定义的,您不能执行
undefined[y]
。是的,在使用它之前检查它是否存在是一种很好的做法;这并不是本练习的直接部分……而且有很多方法可以检查它是否存在。我的意思是,对存在的测试将是一个两步过程(我指出这一点是因为它有点繁琐):您必须测试它是否
列表[x]
是在您可以测试是否定义了
列表[x][y]
之前定义的,否则您不仅会返回
未定义的
,还会返回一个JS错误,停止代码的执行。但是,如果整件事都包含在