2014-09-20 22 views
0

我有一个Ajax请求,返回数字类型的纬度/经度坐标。JavaScript JQuery - 两个数组之间的隐式比较

对于每个响应,我需要检查每个返回的值是否在数组中,如果没有添加它。继承人是我到目前为止有:

$.each(jqXHR.responseJSON, function (index, value) { 

    if($.inArray([value.loc.coordinates[1],value.loc.coordinates[0]], settings.locations) === -1){ 
     console.log('adding...'); 
     settings.locations.push([value.loc.coordinates[1], value.loc.coordinates[0]]); 
    } else { 
     console.log('already have...'); 
    } 

}); 

测试显示,比较总是失败,甚至当它已经seettings.locations内的附加值。任何人都可以提出问题出在哪里?


UPDATE:行,所以感谢评论到目前为止我可以看到,这是不正确的使用inArray的。下面我现在有:

$.each(jqXHR.responseJSON, function (index, value) { 

    $.each(settings.locations, function(key, cValue) { 

     if(value.loc.coordinates[1]+','+value.loc.coordinates[0] !== cValue){ 
      console.log('Adding new coords..') 
      settings.locations.push([value.loc.coordinates[1], value.loc.coordinates[0]]); 
     } else { 
      console.log('Already have: ' +cValue); 
     } 

    }); 

}); 

再次,这些永远不会评估匹配,因此它下降到一个无限循环。

+0

不能使用'$ .inArray()'来一次寻找两个坐标。它根本不会那样工作。它只查找一个必须与整个数组元素匹配才能找到的单个项目。您将需要编写自己的循环来搜索数组。 – jfriend00 2014-09-20 18:07:51

回答

0

请注意你如何使用$ .inArray。它一次只检查一个值。

$.inArray(1, [1, 2]); 
// output: 0 -> exists at index 0 

$.inArray(2, [1, 2]); 
// output: 1 -> exists at index 1 

$.inArray([1, 2], [1, 2]); 
// output: -1 

其实第一个参数不能是数组。 或者你可以象下面这样:

$.each(jqXHR.responseJSON, function (index, value) { 

    if ($.inArray(value.loc.coordinates[1], settings.locations) !== -1) { 
     if ($.inArray(value.loc.coordinates[0], settings.locations) !== -1) { 
      return; 
     } 
     return; 
    } 
    settings.locations.push([value.loc.coordinates[1], value.loc.coordinates[0]]); 
}); 
+0

OP的数据略有不同,它应该是作为第二个参数传递的'[[1,2],[3,4],[5,6],...]',第一个参数当然是' [1,2]'或其他东西。他希望在两个数组之间进行某种隐式比较。 – 2014-09-20 18:16:02

+0

我想你误解了OP的数据(请参阅我上面的评论)。他的'settings.locations'实际上是一个**阵列**。每个位置都是一个数组。 – 2014-09-20 18:20:04

+0

我知道,但$ .inArray不是用于比较数组的适当方法。因为它不接受数组,因为它是第一个参数。 [Jquery官方网站](http://api.jquery.com/jquery.inarray/) – sadrzadehsina 2014-09-20 18:20:11

0

我的解决办法。我决定改变存储的数据的格式是一个对象:

"37.502917,-122.501335" : true, 
"37.494473,-122.499619" : true, 

然后,我可以很容易地检查是否存在:

$.each(jqXHR.responseJSON, function (index, value) { 
    var newLocation = value.loc.coordinates[1] + ',' + value.loc.coordinates[0]; 
    if (currentData[newLocation] === undefined) { 
     currentData[newLocation] = currentData[newLocation] || true; 
     ............