5

次のような配列があります。

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 行目で同じであるため、重複しているため、1 つを削除する必要があります。

4

7 に答える 7

13

この質問の難しさは、同じ値が含まれていても、異なる配列が等しく比較されることは決してないということです。したがって、直接比較する方法など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;
    })
}

whereは、 (それらが何であれ)比較可能なスカラー値にkey変換する「ハッシュ」関数です。あなたの特定の例では、配列itemsに適用するだけで十分なようです:Array.join

uniqueCoords = uniq(coordinates, [].join)
于 2013-01-19T16:35:25.090 に答える
5

これには、標準の 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++;
    }    
}

ただし、数千のポイントがある場合は、最初に値をソートすることを検討する必要があるよりもゆっくりと動作し、次に 1 つのループで重複を削除します。

于 2013-01-19T16:55:59.520 に答える
1

thg435からの回答を書き直し(コメントを投稿することはできません)、代わりに 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);
于 2014-04-09T16:15:45.777 に答える
0

一意の座標ペアのみを保持する別の配列を作成する方が簡単かもしれません

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]);
}
于 2013-01-19T16:24:32.440 に答える
-1

座標[][] dataTypeについてはわかりません。それに応じて比較を行います。

  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.
于 2013-01-19T16:10:33.977 に答える