2017-09-11 1 views
0

Entfernen Duplikate von 2D-Array

var result = [ 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, -2, 0, 0], 
 
    [0, -2, 0, 0], 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, -2, 0, 0], 
 
    [0, -2, 0, 0], 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, 0, 0, -2], 
 
    [0, 0, -2, 0], 
 
    [0, -2, 0, 0], 
 
    [0, -2, 0, 0], 
 
    [-2, 0, 0, 0], 
 
    [-2, 0, 0, 0], 
 
    [-2, 0, 0, 0], 
 
    [-2, 0, 0, 0], 
 
    [-2, 0, 0, 0], 
 
    [-2, 0, 0, 0] 
 
]; 
 
for (var i = 0; i < result.length; i++) { //remove duplicates 
 
    var listI = result[i]; 
 
    loopJ: for (var j = 0; j < result.length; j++) { 
 
    var listJ = result[j]; //listJ and listI point at different arrays within the result array 
 
    if (listI === listJ) continue; //Ignore itself 
 
    for (var k = listJ.length; k >= 0; k--) { //checks whether the values are different, if they are continue with the loop 
 
     if (listJ[k] !== listI[k]) continue loopJ; 
 
    } 
 
    // At this point, their values are equal so we remove from the result array 
 
    result.splice(j, 1); 
 
    } 
 
} 
 
document.getElementById("result").innerHTML = JSON.stringify(result);
<div id="result"> 
 

 
</div>

Ich versuche, Duplikate von einigen Daten erzeugt mein Programm zu entfernen, wenn es einen 2D-Array permutiert, aber in einigen Fällen scheitert es alle Duplikate zu entfernen. Ich bin ein wenig verloren, warum, der Code ist kurz und kommentiert, ich habe hart in der Eingabe 2d-Array unter der Ergebnisvariablen.

Antwort

3

https://jsfiddle.net/h26ro89p/2/

Sie haben vergessen, einen Index einen Rückzieher, wenn der Spleiß durchführen:

result.splice(j, 1); 
    j--; 

Um dies zu verhindern in der Zukunft die Schleife umkehren könnte oder sogar eine while-Schleife verwenden. Mit ein bisschen alten Helden google suchen Sie eine Lösung finden Sie hier:

Remove items from array with splice in for loop

+0

Ah verdammt, danke! Ich werde dies als richtig markieren, wenn es mich – Shard

0

ich etwas kürzer mit lodash hinzufügen wird

https://jsfiddle.net/h26ro89p/3/

 var result = [[0,0,0,-2],[0,0,-2,0],[0,0,0,-2],[0,0,-2,0],[0,-2,0,0],[0,-2,0,0],[0,0,0,-2],[0,0,-2,0],[0,0,0,-2],[0,0,-2,0],[0,-2,0,0],[0,-2,0,0],[0,0,0,-2],[0,0,-2,0],[0,0,0,-2],[0,0,-2,0],[0,-2,0,0],[0,-2,0,0],[-2,0,0,0],[-2,0,0,0],[-2,0,0,0],[-2,0,0,0],[-2,0,0,0],[-2,0,0,0]]; 


document.getElementById("result").innerHTML = JSON.stringify(_.uniqWith(result, _.isEqual)); 
+0

Ich habe nie Lodash verwendet, muss es versuchen, obwohl es solche Sachen tun kann – Shard

0

prüfen diese Geige https://jsfiddle.net/c2uk0xow/3/, Sie‘ Ich brauche JQuery, um $ .each-Funktion zu verwenden.

var arr = [ 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, -2, 0, 0], 
     [0, -2, 0, 0], 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, -2, 0, 0], 
     [0, -2, 0, 0], 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, 0, 0, -2], 
     [0, 0, -2, 0], 
     [0, -2, 0, 0], 
     [0, -2, 0, 0], 
     [-2, 0, 0, 0], 
     [-2, 0, 0, 0], 
     [-2, 0, 0, 0], 
     [-2, 0, 0, 0], 
     [-2, 0, 0, 0], 
     [-2, 0, 0, 0] 
    ]; 
    var _tmp_arr = []; 
    var result = []; 
    $.each(arr, function(i,v) 
    { 
     if(!_tmp_arr.includes(JSON.stringify(v))) 
     { 
      _tmp_arr.push(JSON.stringify(v)); 
     } 
    }); 

    $.each(_tmp_arr, function(i,v) 
    { 
     result.push(JSON.parse(v)); 
    }); 

Hinweis: Ich musste Zeichenfolge konvertieren und dann wieder analysieren, um beiden Ergebnisse zu vergleichen. [-2,0,0,0] === [-2,0,0,0] zurückgegeben falsch, aber nachdem ich es stringify gab es, "[-2,0,0,0]" === "[-2,0,0,0]".