web-dev-qa-db-fra.com

Supprimer les éléments en double de Array en Javascript

J'ai un tableau avec obejcts email et Id donc je veux supprimer les éléments en double qui ont des identifiants similaires.

Exemple:

var newarray=[
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"B"
    },
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"C"
    },
    {
        Email:"[email protected]",
        ID:"C"
    }
];

Maintenant, je dois supprimer les éléments en double qui ont des identifiants sont communs.Par conséquent, je m'attends à la fin du tableau

var FinalArray=[
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"B"
    },  
    {
        Email:"[email protected]",
        ID:"C"
    }
];
6
Santosh Khavekar

Utilisez Array.prototype.filter pour filtrer les éléments et conserver un contrôle des doublons, utilisez un tableau temp.

var newarray = [{
  Email: "[email protected]",
  ID: "A"
}, {
  Email: "[email protected]",
  ID: "B"
}, {
  Email: "[email protected]",
  ID: "A"
}, {
  Email: "[email protected]",
  ID: "C"
}, {
  Email: "[email protected]",
  ID: "C"
}];
   
// Array to keep track of duplicates
var dups = [];
var arr = newarray.filter(function(el) {
  // If it is not a duplicate, return true
  if (dups.indexOf(el.ID) == -1) {
    dups.Push(el.ID);
    return true;
  }

  return false;
  
});

console.log(arr);

5
void

Vous pouvez le filtrer avec une table de hachage.

var newarray = [{ Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "B" }, { Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "C" }, { Email: "[email protected]", ID: "C" }],
    filtered = newarray.filter(function (a) {
        if (!this[a.ID]) {
            this[a.ID] = true;
            return true;
        }
    }, Object.create(null));

console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6 avec Set

var newarray = [{ Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "B" }, { Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "C" }, { Email: "[email protected]", ID: "C" }],
    filtered = newarray.filter((s => a => !s.has(a.ID) && s.add(a.ID))(new Set));

console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

3
Nina Scholz

Si vous pouvez utiliser des bibliothèques Javascript telles que underscore ou lodash, je vous recommande de consulter la fonction _.uniq dans leurs bibliothèques. De Lodash:

_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

Ici vous devez utiliser comme ci-dessous,

var non_duplidated_data = _.uniq(newarray, 'ID'); 
2
mymotherland

Une autre solution utilisant Array.prototype.reduce et une table de hachage - voir la démo ci-dessous:

var newarray=[ { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"B" }, { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"C" }, { Email:"[email protected]", ID:"C" } ];

var result = newarray.reduce(function(hash){
  return function(prev,curr){
     !hash[curr.ID] && (hash[curr.ID]=prev.Push(curr));
     return prev;
  };
}(Object.create(null)),[]);

console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

1
kukkuz