Skip to content Skip to sidebar Skip to footer

Remove Duplicate Element Pairs From Multidimensional Array

I have an array that looks like this: 1. coordinates = [ [16.343345, 35.123523], 2. [14.325423, 34.632723], 3. [15.231512, 35.426914], 4.

Solution 1:

The difficulty in this question that different arrays never compare equal even if they contain same values. Therefore direct comparison methods, like indexOf won't work.

The following pattern might be useful to solve this. Write a function (or use a built-in one) that converts arrays to scalar values and checks if these values are unique in a set.

uniq = function(items, key) {
    varset = {};
    return items.filter(function(item) {
        var k = key ? key.apply(item) : item;
        return k inset ? false : set[k] = true;
    })
}

where key is a "hash" function that convert items (whatever they are) to comparable scalar values. In your particular example, it seems to be enough just to apply Array.join to arrays:

uniqueCoords = uniq(coordinates, [].join)

Solution 2:

You can use standard javascript function splice for this.

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

However, if you have thousands of points it will work slowly, than you need to consider to sort values at first, then remove duplicates in one loop.

Solution 3:

I rewrote the answer from thg435 (It does not allow me to post comments) and prototype it also using jQuery instead, so this will work on all browsers using it (Even 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;
    });
}

You can use it like:

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

Solution 4:

If you are not on Safari this single liner could do the job

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>");

Solution 5:

It might be simpler to create another array keeping only unique coordinate pairs

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, ignorecontinue;
    }

    doneCoors.push(coorStr);
    uniqueCoors.push(coordinates[x]);
}

Post a Comment for "Remove Duplicate Element Pairs From Multidimensional Array"