web-dev-qa-db-fra.com

lodash: Récupère les valeurs en double d'un tableau

Disons que j'ai un tableau comme celui-ci: [1, 1, 2, 2, 3]

Je veux obtenir les doublons qui sont dans ce cas: [1, 2] 

Est-ce que lodash soutient cela? Je veux le faire de la manière la plus courte possible.

23
zianwar

Vous pouvez utiliser ceci:

_.filter(arr, (val, i, iteratee) => _.includes(iteratee, val, i + 1));

Notez que si un nombre apparaît plus de deux fois dans votre tableau, vous pouvez toujours utiliser _.uniq.

33
saadel

Une autre méthode consiste à regrouper les éléments uniques et à renvoyer les clés de groupe contenant plus d'un élément.

_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value()
19
Gaafar
var array = [1, 1, 2, 2, 3];
var groupped = _.groupBy(array, function (n) {return n});
var result = _.uniq(_.flatten(_.filter(groupped, function (n) {return n.length > 1})));

Cela fonctionne également pour les tableaux non triés.

12
Mikhail Romanov

Que diriez-vous d'utiliser countBy() suivi de reduce()?

const items = [1,1,2,3,3,3,4,5,6,7,7];

const dup = _(items)
    .countBy()
    .reduce((acc, val, key) => val > 1 ? acc.concat(key) : acc, [])
    .map(_.toNumber)

console.log(dup);
// [1, 3, 7]

http://jsbin.com/panama/edit?js,console

4
Brian Park

Une autre façon, mais en utilisant des filtres et ecmaScript 2015 (ES6)

var array = [1, 1, 2, 2, 3];

_.filter(array, v => 
  _.filter(array, v1 => v1 === v).length > 1);

//→ [1, 1, 2, 2]
4
Rafael Zeffa

voici la mienne, comme es6-like, deps-free, répondre. avec filtre au lieu de réducteur

// this checks if elements of one list contains elements of second list 
// example code
[0,1,2,3,8,9].filter(item => [3,4,5,6,7].indexOf(item) > -1)

// function
const contains = (listA, listB) => listA.filter(item => listB.indexOf(item) > -1) 
contains([0,1,2,3], [1,2,3,4]) // => [1, 2, 3]

// only for bool
const hasDuplicates = (listA, listB) => !!contains(listA, listB).length

edit: hmm mon problème est le suivant: j’ai lu q comme question générale, mais c’est strictement pour lodash, mais j’aimerais dire que vous n’avez pas besoin de lodash ici :)

1
vonsko

Bien, vous pouvez utiliser ce morceau de code qui est beaucoup plus rapide car il a une complexité de O(n) et cela n’utilise pas Lodash.

[1, 1, 2, 2, 3]
.reduce((agg,col) => {
  agg.filter[col] = agg.filter[col]? agg.dup.Push(col): 2;
  return agg
 },
 {filter:{},dup:[]})
.dup;

//result:[1,2]
1
Rahul Surabhi

J'espère que la solution vous aide et qu'elle vous sera utile dans toutes les conditions

  hasDataExist(listObj, key, value): boolean {
    return _.find(listObj, function(o) { return _.get(o, key) == value }) != undefined;
  }



  let duplcateIndex = this.service.hasDataExist(this.list, 'xyz', value);
0