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
.
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>
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);
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.
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.
À 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.
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;
}
})
}