Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从多维数组中删除重复的元素对_Javascript_Arrays_Multidimensional Array_Duplicates_Coordinates - Fatal编程技术网

Javascript 从多维数组中删除重复的元素对

Javascript 从多维数组中删除重复的元素对,javascript,arrays,multidimensional-array,duplicates,coordinates,Javascript,Arrays,Multidimensional Array,Duplicates,Coordinates,我有一个如下所示的数组: 1. coordinates = [ [16.343345, 35.123523], 2. [14.325423, 34.632723], 3. [15.231512, 35.426914], 4. [16.343345, 35.123523], 5. [15.231512, 32.426914] ] 第5行的纬度与第3行的纬度相同

我有一个如下所示的数组:

1.  coordinates = [ [16.343345, 35.123523],
2.                  [14.325423, 34.632723],
3.                  [15.231512, 35.426914],
4.                  [16.343345, 35.123523],
5.                  [15.231512, 32.426914] ]
第5行的纬度与第3行的纬度相同,但它们的经度不同,因此不是重复的


第3行和第6行的纬度和经度都相同,因此都是重复的,应该删除其中一个。

我不确定坐标[][]数据类型。进行相应的比较

  var dubJRows= new Array();
  for(int i = 0; i <  coordinates.length -2; i++){
    for(int j = i+1; j <  coordinates.length -1; j++){
        if (i != j && chk_dubJRows_not_contains(j)) {
           innerArray1 [1][1] = coordinates[i];
           innerArray2 [1][1] = coordinates[j];
           if ( innerArray1 [1][0] == innerArray2[1][0] 
                   && innerArray1[1][1] == innerArray2[1][1]) {
               dubJRows.push(j);
            }
         }
       }
    }
    //REMOVE ALL dubJRows from coordinates.
var dubJRows=new Array();
对于(int i=0;i
创建另一个仅保留唯一坐标对的数组可能更简单

var uniqueCoors = [];
var doneCoors = [];
for(var x = 0; x < coordinates.length; x++) {
    var coorStr = coordinates[x].toString();

    if(doneCoors.indexOf(coorStr) != -1) {
        // coordinate already exist, ignore
        continue;
    }

    doneCoors.push(coorStr);
    uniqueCoors.push(coordinates[x]);
}
var uniqueCoors=[];
var doneCoors=[];
对于(var x=0;x
这个问题的难点在于,不同的数组即使包含相同的值也无法进行相等的比较。因此,像
indexOf
这样的直接比较方法是行不通的

以下模式可能有助于解决此问题。编写一个函数(或使用内置函数),将数组转换为标量值,并检查这些值在集合中是否唯一

uniq = function(items, key) {
    var set = {};
    return items.filter(function(item) {
        var k = key ? key.apply(item) : item;
        return k in set ? false : set[k] = true;
    })
}
其中,
是一个“哈希”函数,它将
(无论它们是什么)转换为可比较的标量值。在您的特定示例中,仅应用
数组似乎就足够了。将
加入数组:

uniqueCoords = uniq(coordinates, [].join)

您可以为此使用标准javascript函数

for(var i = 0; i < coordinates.length; i++) {
    for(var j = i + 1; j < coordinates.length; ) {
        if(coordinates[i][0] == coordinates[j][0] && coordinates[i][1] == coordinates[j][1])
            // Found the same. Remove it.
            coordinates.splice(j, 1);
        else
            // No match. Go ahead.
            j++;
    }    
}
for(变量i=0;i

但是,如果你有几千个点,它将比你首先考虑的值慢,然后在一个循环中删除重复。

< P>我改写了答案(它不允许我发表评论),并且用jQuery替代它,所以这将对所有使用它的浏览器(甚至IE7)

起作用。 您可以像这样使用它:

arr = arr.uniq([].join);
功能排序坐标(arr){
var obj={};
对于(变量i=0,l=arr.length;i
如果您不在Safari上,那么这艘班轮就可以完成这项工作

var arr=[[16.343345,35.123523],
[14.325423, 34.632723],
[15.231512, 35.426914],
[16.343345, 35.123523],
[15.231512, 32.426914]],
lut={},
红色=arr.filter(a=>lut[a]?false:lut[a]=true);

document.write(“+JSON.stringify(红色,null,2)+”)
您应该更新您的问题,以包括您已经尝试过的任何尝试。您是否尝试过对它们进行排序,然后将当前记录与下一个记录进行比较?对于从列表中删除重复项之类的任务,
15231512,35426914
(4个整数)不应该是
15.231512,35.426914
(2个浮点数)吗,你最好的选择通常是使用一个预先存在的JS库,比如,因为这段代码比你可能编写的任何代码都有更多的道路测试。你能澄清你的问题吗?第6行不存在,据我估计,第1行和第4行以及第3行和第5行匹配这是O(n^2),根本无法很好地扩展。此外,由于您将复制一些比较,因此没有从0到
坐标的点扫描
j
。例如,
i=3,j=2
i=2,j=3
是相同的比较。OP使用的是JavaScript,而不是JavaScript。请注意,在IE<9中不可用
arr = arr.uniq([].join);
function sortCoordinates(arr){
    var obj = {};
    for(var i = 0, l = arr.length; i < l; i++){
        var el = arr[i];
        var lat = el[0];
        var lng = el[1];

        if(!obj[lat + lng]){
            obj[lat + lng] = [lat, lng];
        } 
    }

    var out = [];
    for(p in obj){
        out.push([obj[p][0], obj[p][1]]);
    }
    return out;
}