web-dev-qa-db-fra.com

Comment puis-je obtenir un tableau unique basé sur la propriété de l'objet en utilisant le trait de soulignement

J'ai un tableau d'objets et je souhaite en obtenir un nouveau, unique basé sur une seule propriété. Existe-t-il un moyen simple d'y parvenir?

Par exemple.

[ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]

Cela entraînerait 2 objets avec le nom = facture enlevé une fois.

37
el_pup_le

Utilisez la fonction uniq

var destArray = _.uniq(sourceArray, function(x){
    return x.name;
});

De la docs:

Produit une version sans doublon du tableau, en utilisant === pour tester l'égalité des objets. Si vous savez à l'avance que le tableau est trié, transmettre true pour isSorted exécutera un algorithme beaucoup plus rapide. Si vous souhaitez calculer des éléments uniques en fonction d'une transformation, transmettez une fonction itérateur.

Dans l'exemple ci-dessus, la fonction utilise le nom des objets afin de déterminer l'unicité.

60
ColinE

Si vous voulez vérifier toutes les propriétés, alors Lodash 4 est livré avec _.uniqWith (sourceArray, _.isEqual)

6
user3437231

Une approche meilleure et rapide 

var table = [
  {
    a:1,
    b:2
  },
  {
    a:2,
    b:3
  },
  {
    a:1,
    b:4
  }
];

let result = [...new Set(table.map(item => item.a))];
document.write(JSON.stringify(result));

Trouvé ici

3
Mudasar Rauf

Vous pouvez utiliser la fonction _.uniqBy

var array = [ { id: 1, name: 'bob' }, { id: 2, name: 'bill' }, { id: 1, name: 'bill' },{ id: 2, name: 'bill' } ];

var filteredArray = _.uniqBy(array,function(x){ return x.id && x.name;});

console.log(filteredArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

Dans l'exemple ci-dessus, le filtrage est basé sur l'unicité de la combinaison des propriétés id & name.

si vous avez plusieurs propriétés pour un objet . puis pour rechercher un tableau unique d'objets en fonction de propriétés spécifiques, vous pouvez suivre cette méthode de combinaison des propriétés dans la méthode _.uniqBy ().

2
JEEVAN GEORGE ANTONY

Si vous avez besoin d'une solution JavaScript pure:

var uniqueProperties = {};

var notUniqueArray = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ];


for(var object in notUniqueArray){
   uniqueProperties[notUniqueArray[object]['name']] = notUniqueArray[object]['id'];
}

var uniqiueArray = [];

for(var uniqueName in uniqueProperties){
   uniqiueArray.Push(
     {id:uniqueProperties[uniqueName],name:uniqueName});
}

//uniqiueArray
1
gotqn

Je recherchais une solution qui n'exigeait pas de bibliothèque et la mettais en place, alors j'ai pensé l'ajouter ici. Ce n'est peut-être pas idéal, ou cela ne fonctionne pas dans toutes les situations, mais c'est ce que je demande, donc je pourrais potentiellement aider quelqu'un d'autre:

const uniqueBy = (items, reducer, dupeCheck = [], currentResults = []) => {
  if (!items || items.length === 0) return currentResults;
  
  const thisValue = reducer(items[0]);
  
  const resultsToPass = dupeCheck.indexOf(thisValue) === -1 ?
    [...currentResults, items[0]] : currentResults;
    
  return uniqueBy(
    items.slice(1),
    reducer,
    [...dupeCheck, thisValue],
    resultsToPass,
  );    
}

const testData = [
  {text: 'hello', image: 'yes'},
  {text: 'he'},
  {text: 'hello'},
  {text: 'hell'},
  {text: 'hello'},
  {text: 'hellop'},
];

const results = uniqueBy(
  testData,
  item => {
    return item.text
  },
)

console.dir(results)

0
OliverRadini