如何比较LatLng对象与数组中的另一个对象?

时间:2015-03-20 09:29:34

标签: javascript html arrays google-maps-api-3

我是JavaScript的初学者。最近我正在尝试在Google Map中开发关联应用程序。但我遇到了一个奇怪的问题。

请参阅以下代码。

<html>
<head>
<script src = "http://maps.googleapis.com/maps/api/js"></script>
</head>

<body>
<script>

var buf = []; 
var pos1  = new google.maps.LatLng(1, 2); buf.push(pos1); 
var pos2  = new google.maps.LatLng(3, 4); buf.push(pos2); 
var pos3  = new google.maps.LatLng(5, 6); buf.push(pos3); 

//initialize a new object here
var pos4  = new google.maps.LatLng(3, 4);

if ( buf.indexOf(pos4) != -1 ) 
    document.write("yes");
else
    document.write("no");

</script>
<body>
</html>

由于pos4的值与pos2相同,如果数组中位置确实存在,则打印结果应为“是”。 然而,它在屏幕上打印“否”。

我尝试打印pos4pos2的值。我发现都是相同的,我不知道为什么这个检查失败了。 有没有解决问题的方案?

2 个答案:

答案 0 :(得分:1)

根据Google Maps API V3 docs,所有LatLng个对象都有一个equals方法,可用于比较两个不同的LatLng个对象:

var p1 = new google.maps.LatLng(3, 10),
    p2 = new google.maps.LatLng(3, 10);

console.log(p1.equals(p2)); // logs "true"

答案 1 :(得分:0)

默认indexOf在对象比较中不起作用,因为2个对象永不相等(只有具有相同的引用时才会出现),{ {3}}

您可以根据as pointed out here创建indexOf功能。并比较对象中的lat()lng()this post

buf.indexOf = function indexOf(elem){
  index = -1;
  for(var i = 0, len = buf.length; i < len; i++) {
    if (this[i].lat() === elem.lat() 
        && this[i].lng() === elem.lng() ) {
      index = i;
      break;
    }
  }
  return index;
}

注意:由于@ greg-burghardt sugested,您可以将this[i].lat() === elem.lat() && this[i].lng() === elem.lng()替换为this[i].equals(elem)

<强>用法:

var buf = []; 
buf.indexOf = function indexOf(elem){
  index = -1;
  for(var i = 0, len = buf.length; i < len; i++) {
    if (this[i].lat() === elem.lat() 
        && this[i].lng() === elem.lng() ) {
      index = i;
      break;
    }
  }
  return index;
}

var pos1  = new google.maps.LatLng(1, 2); buf.push(pos1); 
var pos2  = new google.maps.LatLng(3, 4); buf.push(pos2); 
var pos3  = new google.maps.LatLng(5, 6); buf.push(pos3); 

//initialize a new object here
var pos4  = new google.maps.LatLng(3, 4);
var status = "";
if ( buf.indexOf(pos4) != -1 ) 
  status += 'yes - ' + pos4 + '- index ' +  buf.indexOf(pos4);
else
  status += "no";

var pos5  = new google.maps.LatLng(1, 4);
status += '<br />';
if ( buf.indexOf(pos5) != -1 ) 
  status += 'yes - ' + pos5 + '- index ' +  buf.indexOf(pos4);
else
  status += 'no - ' + pos5;  
  
document.getElementById('status').innerHTML = status;
<head>
  <script src = "http://maps.googleapis.com/maps/api/js"></script>
</head>
<body>
  <div id="status"></div>
<body>