web-dev-qa-db-fra.com

Supprimer les éléments en double du tableau Javascript

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

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

http://jsfiddle.net/P3gpp/

C'est la partie qui semble ne pas fonctionner:

sort = sort.Push(i);
textVal = sort;
return textVal;
15
Matthew

Pourquoi le faire à la dure, cela peut être fait plus facilement en utilisant la fonction de filtre javascript qui est spécifiquement destinée à ce type d'opération:

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

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


---------------------
Output: ["Apple", "bannana", "orange"]
51
user2668376

Basé sur la solution user2668376, ceci renverra 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 faire:

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

Le résultat sera; [1, 3, 7].

4
Frank Roth

Voici les fonctions que j'ai créées/utilisées pour supprimer les 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 le premier, voici à quoi pourrait ressembler votre code:

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/

4
Ian

Vous pouvez utiliser Array.reduce() pour supprimer les doublons. Vous avez besoin d'un objet d'assistance pour savoir combien de fois 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 utilisée directement pour remplir à nouveau la zone de texte, sans affecter l'ordre de tri d'origine.

Démo

2
Ja͢ck

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);
}
1
Blender
      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]
0
sivanthi