web-dev-qa-db-fra.com

Utilisation de lodash pour vérifier si un tableau a des valeurs en double

Selon vous, quelle serait la meilleure façon (la meilleure peut être interprétée comme la plus lisible ou la plus performante, votre choix) d'écrire une fonction à l'aide des utilitaires lodash afin de vérifier un tableau pour les valeurs en double.

Je veux saisir ['foo', 'foo', 'bar'] et avoir la fonction return true. Et saisissez ['foo', 'bar', 'baz'] et avoir la fonction return false.

20
nackjicholson

Vous pouvez essayer ce code:

function hasDuplicates(a) {
  return _.uniq(a).length !== a.length; 
}

var a = [1,2,1,3,4,5];
var b = [1,2,3,4,5,6];

document.write(hasDuplicates(a), ',',hasDuplicates(b));
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>
42
agershun

Vous pouvez vérifier qu'il existe _.some élément du tableau qui ne renvoie pas son propre emplacement lorsqu'il est recherché dans le tableau. En d'autres termes, il y a au moins un élément qui a une correspondance plus tôt dans le tableau.

function hasDuplicates(array) {
    return _.some(array, function(elt, index) { 
        return array.indexOf(elt) !== index; 
    });
}

C'est peut-être plus rapide que le _.uniq solution, car il identifiera immédiatement le premier élément dupliqué sans avoir à calculer l'intégralité du tableau unique.

Ou, selon votre style de codage et votre désir de lisibilité, et si vous souhaitez utiliser les fonctions fléchées ES6 pour plus de brièveté:

var earlierMatch  = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
8
user663031

Eh bien, il y en a toujours. la fonction _. uniq () de lodash. Cette fonction retourne en fait un nouveau tableau qui ne contient que des valeurs uniques, donc vérifier si la longueur du tableau a changé vous obtiendrait votre valeur "vraie" ou "fausse" à vous-même, je crois.

2
Paul Wostenberg

Je ne connais pas lodash mais je soumets:

_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });

Le problème avec toutes les solutions proposées jusqu'à présent est que l'ensemble du tableau d'entrée doit être traité pour obtenir une réponse, même si la réponse est évidente à partir des 2 premiers éléments du tableau.

2
sebnukem

À partir d'ES6, vous pouvez simplement utiliser Set donc cela devient:

let hasDuplicates = arr => new Set(arr).size != arr.length

console.log(hasDuplicates([5,3,2,1,2,1,2,1]))
console.log(hasDuplicates([1,2,3,4,5]))

Ce qui nie quelque peu l'utilisation du lodash dans ce cas particulier.

1
Akrion

Pas besoin d'utiliser lodash, utilisez plutôt le code suivant:

function getDuplicates(array, key) {
  return array.filter(e1=>{
    if(array.filter(e2=>{
      return e1[key] === e2[key];
    }).length > 1) {
      return e1;
    }
  })
}
0
Hushen Savani