2013-08-02 4 views
15

Je cherche un moyen facile de supprimer une valeur en double d'un tableau. J'ai compris comment détecter s'il y avait un doublon ou non, mais je ne sais pas comment le "pousser" de la valeur. Par exemple, si vous allez au lien fourni, puis tapez, "abca" (appuyez sur la touche retour/entrée après chaque lettre) .. il alertera "dupliquer!"Supprimer un élément en double de tableau

Mais je veux aussi comprendre comment supprimer ce doublon de la zone de texte?

http://jsfiddle.net/P3gpp/

Ceci est la partie qui semble ne pas travailler ::

sort = sort.push(i); 
textVal = sort; 
return textVal; 

Répondre

49

Pourquoi la dure, il peut être fait plus facilement en utilisant la fonction javascript filtre qui est spécifiquement pour ce genre d'opérations:

var arr = ["apple", "bannana", "orange", "apple", "orange"]; 

arr = arr.filter(function(item, index, inputArray) { 
      return inputArray.indexOf(item) == index; 
    }); 


--------------------- 
Output: ["apple", "bannana", "orange"] 
+4

Je pense que, en 2014, cinq ans dans l'ère EcmaScript 5 et avec IE8 en dessous de 10% de la part du navigateur du monde, nous pouvons appeler cela la bonne réponse. Si l'un concerne le support des anciennes versions d'IE, une bibliothèque de polyfill pour EC5 peut être utilisée. – Semicolon

+1

(Je noterais cependant que si 'filter' est la bonne réponse 90% du temps, il n'est pas approprié en soi dans des circonstances où il peut y avoir des références au tableau original ailleurs parce qu'il crée un nouveau tableau et l'original l'objet tableau est laissé intact. – Semicolon

4

Ce sont les fonctions que j'ai créé/utilisation pour la suppression des doublons:

var removeDuplicatesInPlace = function (arr) { 
    var i, j, cur, found; 
    for (i = arr.length - 1; i >= 0; i--) { 
     cur = arr[i]; 
     found = false; 
     for (j = i - 1; !found && j >= 0; j--) { 
      if (cur === arr[j]) { 
       if (i !== j) { 
        arr.splice(i, 1); 
       } 
       found = true; 
      } 
     } 
    } 
    return arr; 
}; 

var removeDuplicatesGetCopy = function (arr) { 
    var ret, len, i, j, cur, found; 
    ret = []; 
    len = arr.length; 
    for (i = 0; i < len; i++) { 
     cur = arr[i]; 
     found = false; 
     for (j = 0; !found && (j < len); j++) { 
      if (cur === arr[j]) { 
       if (i === j) { 
        ret.push(cur); 
       } 
       found = true; 
      } 
     } 
    } 
    return ret; 
}; 

Donc, en utilisant la premier, voici comment votre code pourrait ressembler:

function cleanUp() { 
    var text = document.getElementById("fld"), 
     textVal = text.value, 
     array; 

    textVal = textVal.replace(/\r/g, " "); 
    array = textVal.split(/\n/g); 

    text.value = removeDuplicatesInPlace(array).join("\n"); 
} 

DEMO:http://jsfiddle.net/VrcN6/1/

+1

Merci. Cela fonctionne très bien! – Matthew

1

Vous pouvez le faire facilement avec juste un objet:

function removeDuplicates(text) { 
    var seen = {}; 
    var result = ''; 

    for (var i = 0; i < text.length; i++) { 
     var char = text.charAt(i); 

     if (char in seen) { 
      continue; 
     } else { 
      seen[char] = true; 
      result += char; 
     } 
    } 

    return result; 
} 

function cleanUp() { 
    var elem = document.getElementById("fld"); 

    elem.value = removeDuplicates(elem.value); 
} 
+0

Considérez: 'result + = char in seen? '': seen [char] = char; ' – RobG

2

Vous pouvez utiliser Array.reduce() pour supprimer les doublons. Vous avez besoin d'un objet d'assistance pour suivre le nombre de fois qu'un élément a été vu.

function cleanUp() 
{ 
    var textBox = document.getElementById("fld"), 
    array = textBox.value.split(/\r?\n/g), 
    o = {}, 
    output; 

    output = array.reduce(function(prev, current) { 
     var key = '$' + current; 

     // have we seen this value before? 
     if (o[key] === void 0) { 
      prev.push(current); 
      o[key] = true; 
     } 

     return prev; 
    }, []); 

    // write back the result 
    textBox.value = output.join("\n"); 
} 

La sortie de l'étape reduce() peut être directement utilisé pour remplir à nouveau la zone de texte, sans affecter l'ordre de tri d'origine.

Demo

0
 arr3 = [1, 2, 3, 2, 4, 5]; 

     unique = []; 

    function findUnique(val) 
    { 
    status = '0'; 
    unique.forEach(function(itm){ 

     if(itm==val) 
     { 
     status=1; 
     } 

       }) 
return status; 
} 

arr3.forEach(function(itm){ 

    rtn = findUnique(itm); 
    if(rtn==0) 
    unique.push(itm); 


    }); 

    console.log(unique); // [1, 2, 3, 4, 5] 
4

Basé sur la solution user2668376, cela retournera un nouveau tableau sans doublons.

Array.prototype.removeDuplicates = function() { 
    return this.filter(function (item, index, self) { 
     return self.indexOf(item) == index; 
    }); 
}; 

Après cela, vous pouvez le faire:

[1, 3, 3, 7].removeDuplicates(); 

Résultat sera; [1, 3, 7].

+0

Donc, si user2668376 a déjà répondu à cette solution, pourquoi le répéter? Btw, vous avez trop de soi. – Bergi

+1

Sa solution est sans .prototype. À mon avis, il est préférable de l'utiliser. J'ai supprimé le var self = this; –

Questions connexes