【问题标题】:Remove duplicate element pairs from multidimensional array从多维数组中删除重复的元素对
【发布时间】:2013-01-03 03:48:42
【问题描述】:

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

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 行的纬度和经度都相同,因此是重复的,应该删除一个。

【问题讨论】:

  • 您应该更新您的问题以包含您已经进行的任何尝试。
  • 您是否尝试过对它们进行排序,然后循环比较当前记录与下一条记录的结果?
  • 15,231512, 35,426914(4 个整数)不应该是 15.231512, 35.426914(2 个浮点数)吗?
  • 对于诸如从列表中删除重复项之类的任务,最好的选择通常是使用预先存在的 JS 库之一,例如 lodash,因为这段代码比任何代码都进行了更多的道路测试你可能会写的代码。
  • 你能澄清你的问题吗?第 6 行不存在,据我估计,第 1 行和第 4 行以及第 3 和第 5 行匹配

标签: javascript arrays multidimensional-array duplicates coordinates


【解决方案1】:

这个问题的难点是不同的数组即使包含相同的值也永远不会相等。因此直接比较方法,如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;
    })
}

其中key 是一个“哈希”函数,可将items(无论它们是什么)转换为可比较的标量值。在您的特定示例中,将Array.join 应用于数组似乎就足够了:

uniqueCoords = uniq(coordinates, [].join)

【讨论】:

  • 请注意 filter 在 IE 中不可用
【解决方案2】:

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

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++;
    }    
}

但是,如果您有数千个点,它将运行缓慢,而不是您需要考虑首先对值进行排序,然后在一个循环中删除重复项。

【讨论】:

    【解决方案3】:

    我重写了thg435 的答案(它不允许我发布 cmets)并使用 jQuery 对其进行原型制作,因此这将适用于所有使用它的浏览器(甚至 IE7)

    Array.prototype.uniq = function (key) {
        var set = {};
        return $.grep(this, function (item) {
            var k = key
                ? key.apply(item)
                : item;
            return k in set
                ? false
                : set[k] = true;
        });
    }
    

    你可以像这样使用它:

    arr = arr.uniq([].join);
    

    【讨论】:

      【解决方案4】:

      如果您不在 Safari 上,这个单一的班轮可以完成这项工作

      var arr = [[16.343345, 35.123523],
                 [14.325423, 34.632723],
                 [15.231512, 35.426914],
                 [16.343345, 35.123523],
                 [15.231512, 32.426914]],
          lut = {},
          red = arr.filter(a => lut[a] ? false : lut[a] = true);
      
      document.write("<pre>" + JSON.stringify(red,null,2) + "</pre>");

      【讨论】:

        【解决方案5】:

        创建另一个仅保留唯一坐标对的数组可能更简单

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

        【讨论】:

          【解决方案6】:
          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;
          }
          

          【讨论】:

            【解决方案7】:

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

              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.
            

            【讨论】:

            • 这是 O(n^2) 并且根本无法很好地扩展。此外,没有必要将 j 从 0 扫描到 coordinates.length,因为您将重复一些比较。例如,i=3,j=2i=2,j=3 是相同的比较。
            • OP 使用的是 JavaScript,而不是 Java
            猜你喜欢
            • 2012-04-27
            • 1970-01-01
            • 2017-09-18
            • 1970-01-01
            • 2017-10-19
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            相关资源
            最近更新 更多