J'ai un tableau avec des valeurs répétitives:
[ ['Deer Skin', 1], ['Bear Skin', 1], ['Deer Skin', 1], ['Cougar Skin', 2] ... ]
Je veux les comparer par la valeur sting de index [0] et supprimer les doublons tout en stockant le résultat dans un nouvel objet.
Les valeurs résultantes ressembleraient à:
[
{name: "Deer Skin", quantity: 0}
{name: "Bear Skin", quantity: 0}
{name: "Cougar Skin", quantity: 0}
...
Je ne sais pas trop comment procéder à partir de là. À l'heure actuelle, j'ai un tableau d'objets avec toutes les valeurs de tableau en double initiales supprimées:
[ {name: 'Deer Skin', quantity: 4}, {name: 'Bear Skin', quantity: 5}, {name: 'Cougar Skin', quantity: 4} ... ]
Mais je ne comprends pas comment je peux mapper les valeurs de:
XXX
à l'objet ci-dessus.
3 Réponses :
Puisque vous n'avez pas mentionné la structure du nouvel objet dans lequel vous allez stocker les uniques, vous pouvez faire quelque chose comme ceci:
deduplicatedObj = {
'Deer Skin': 2,
'Bear Skin': 1,
'Cougar Skin': 2
}
Puisque vous stockez la valeur dans un objet, et un objet ne peut avoir que des clés uniques, lorsque vous attribuez item [1] à deduplicatedObj [item [0]] , il écrasera le préexistant valeur le cas échéant.
Le deduplicatedObj ressemblera à quelque chose comme ceci:
const arrayItems = [ ['Deer Skin', 1], ['Bear Skin', 1], ['Deer Skin', 2], ['Cougar Skin', 2] ... ];
const deduplicatedObj = {};
for(let item of arrayItems){
deduplicatedObj[item[0]] = item[1];
}
console.log(deduplicatedObj); // This should be an object with key as 'Deer Skin' and value as 1, and so on.
Vous pouvez utiliser .reduce pour y parvenir. Ici, j'ai initialisé l'accumulateur ( acc ) pour être un objet vide {} . Au fur et à mesure que le tableau est itéré, l'opérateur ternaire décide s'il faut ajouter la quantité à la valeur courante de la clé ( elem [0] ) (nous ajoutons seulement si nous l'avons vu auparavant - si nous avons essayé de ajouter à quelque chose que nous n'avions pas vu avant que nous obtenions NaN comme valeur) ou s'il fallait créer une nouvelle paire clé-valeur (si nous n'avons pas vu la valeur de clé auparavant).
Voir l'exemple de travail ci-dessous:
const arr = [
['Deer Skin', 1],
['Bear Skin', 1],
['Deer Skin', 1],
['Cougar Skin', 2]
];
const res = arr.reduce((acc, elem) => {
elem[0] in acc ? acc[elem[0]] += elem[1] : acc[elem[0]] = elem[1];
return acc;
}, {});
console.log(res);
Ceci est exactement ce que je cherchais. Merci pour l'explication!
@KylePfahler pas de soucis: D
Utilisation de Object.entries, array.reduce et de la déstructuration de tableaux:
const data = [
['Deer Skin', 1],
['Bear Skin', 1],
['Deer Skin', 1],
['Cougar Skin', 2]
];
const reduceData = (data) => data.reduce((acc, [key, count]) => {
if (!acc[key]) acc[key] = 0; // If key doesn't exist yet, add and set count to zero
acc[key] += count;
return acc;
}, {});
console.log(reduceData(data));
// But if you want an array, use Object.entries
console.log(Object.entries(reduceData(data)));
Vous ne devez rien cartographier. Effectuez simplement une itération sur le tableau et ajoutez la valeur de
élément [1]àobj [élément [0]].@FelixKling Cela fonctionnerait-il avec la
valeurde l'élément? Je pense queobj ['Deer Skin']n'existe pas.voir sous "Unique par ...", rubrique stackoverflow.com/a/9229821/2096695