1
votes

JavaScript fusionnant deux tableaux multidimensionnels en tableaux uniques

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


1 commentaires

"J'ai essayé différentes choses ..." - Veuillez ajouter votre approche la plus prometteuse et nous essaierons de vous aider.


4 Réponses :


2
votes

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);


1 commentaires

pourquoi trouver pour une seule valeur? inclut qui fonctionnera mieux.



0
votes

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);


0 commentaires

0
votes

Vous pouvez utiliser _.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);

Avec lodash lodash / fp vous pouvez générer une fonction en utilisant _.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);


0 commentaires

0
votes

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);


0 commentaires