J'essaie de trier les données qui ressemblent à ceci:
{ "section": [ "North" ], "monitor": [ "Single Monitor", "Dual Monitor" ] }
Dans quelque chose qui ressemble à ceci:
{ "Params": [ ["section", "North"], ["monitor", "Single Monitor"], ["section", "North"], ["monitor", "Dual Monitor"] ] }
Mais je suis ayant actuellement des problèmes, j'ai essayé différentes choses telles que la concaténation des tableaux ensemble dans une boucle, ou même l'utilisation de la fonction uniq de lodash mais chaque fois que j'obtiens un résultat non souhaité.
Merci d'avance pour tout aide
4 Réponses :
Vous pouvez agréger votre tableau de tableaux en utilisant array.reduce
:
let obj = { "Params": [ ["section", "North"], ["monitor", "Single Monitor"], ["section", "North"], ["monitor", "Dual Monitor"] ] } let result = obj.Params.reduce((acc,cur) => { let [key,value] = cur; if(!acc[key]){ acc[key] = []; } if(!acc[key].includes(value)){ acc[key].push(value); } return acc; }, {}); console.log(result);
pourquoi trouver
pour une seule valeur? inclut
qui fonctionnera mieux.
Le nombre d'opérations doit être effectué ici. Vous pouvez utiliser réduire
afin de regrouper les données clés. Puisque vous n'avez que le format de tableau de paires clé / valeur, je l'ai donc déstructuré avec [k, v]
indiquant la clé et la valeur. Ensuite, pour supprimer les valeurs en double, j'ai utilisé Set
.
var data={ "Params": [ ["section", "North"], ["monitor", "Single Monitor"], ["section", "North"], ["monitor", "Dual Monitor"] ] }; var result = data.Params.reduce((a,[k, v])=>(a[k] = [...(a[k] || []), v], a[k] = [...new Set(a[k])], a),{}); console.log(result);
Vous pouvez utiliser Avec lodash lodash / fp vous pouvez générer une fonction en utilisant _.groupBy ()
le _.head ()
(premier élément de chaque paire) pour regrouper des éléments. Ensuite, utilisez _.mapValues ()
pour parcourir chaque groupe, mappez-le pour obtenir l'élément _.last ()
, et utilisez _.uniq () pour obtenir uniquement les valeurs uniques:
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
const { flow, groupBy, head, mapValues, map, last, uniq } = _;
const fn = flow(
groupBy(head),
mapValues(flow(
map(last),
uniq
))
);
const data = {"Params":[["section","North"],["monitor","Single Monitor"],["section","North"],["monitor","Dual Monitor"]]};
const result = fn(data.Params);
console.log(result);
_.flow ()
qui fait la même chose: <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
const data = {"Params":[["section","North"],["monitor","Single Monitor"],["section","North"],["monitor","Dual Monitor"]]};
const result = _.mapValues(
_.groupBy(data.Params, _.head), // group by the first item
g => _.uniq(_.map(g, _.last)) // map each group to the last item, and get unique values
);
console.log(result);
Vous pouvez activer réduire () méthode à groupBy fonctionne comme suit
let obj = { "Params": [ ["section", "North"], ["monitor", "Single Monitor"], ["section", "North"], ["monitor", "Dual Monitor"] ] }; const res = obj.Params.reduce((acc, [key, val]) => { acc[key] = acc[key] || []; if (!acc[key].includes(val)) { acc[key].push(val); } return acc; }, {}); console.log(res);
"J'ai essayé différentes choses ..." - Veuillez ajouter votre approche la plus prometteuse et nous essaierons de vous aider.