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.
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é.
Si vous voulez vérifier toutes les propriétés, alors Lodash 4 est livré avec _.uniqWith (sourceArray, _.isEqual)
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));
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 ().
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
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)