0
votes

Créer une matrice multidimensionnelle de [Touche, Value] avec Key Compte unique en tant que valeur du tableau de l'objet JSON

Actuellement, j'ai une matrice d'objet JSON renvoyé par le serveur

[
  //designation count
  ["ASE", 2],
  ["SE", 2]
],
  [
    //project count
    ["ABC", 1],
    ["DEF", 2]
  ],
  //and similarly others.


2 commentaires

Est-il prudent de supposer que chaque objet de la matrice a les mêmes clés?


Non, les clés seront différentes, c'est juste pour cet exemple, j'ai présenté ce tableau de données JSON.


3 Réponses :



1
votes

Itérate sur les données avec Réduire code> pour créer un objet groupé par type. Voici une fonction réutilisable - il suffit de passer dans les données code> code> et du type code>.

p>

const data = [{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Rishi Ranabhat","project":"ABC"},{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Biplap Bhattarai","project":"DEF"},{"billed":"No","designation":"SE","involvement":"Part Time","name":"Ram k","project":"DEF"}];

function getCounts(data) {

  // Grab the data keys. It assumes that each object in
  // the array has the same keys
  const keys = Object.keys(data[0]);

  // Using `reduce` iterate over the keys to build
  // up an object that groups the results from the inner
  // `reduce` operation by key
  return keys.reduce((out, key) => {

    // `map` out the data by type
    const typeArr = data.map((obj) => obj[key]);

    // Iterate over the type data. We pass in an initial
    // object to capture the counts, so we need to use
    // `Object.values` to grab the object values at the end
    // of the iteration
    out[key] = Object.values(typeArr.reduce((acc, id) => {

      // If the key doesn't exist in the accumulator object
      // create it and create a new array at its value
      acc[id] = acc[id] || [id, 0];

      // Increment the second index (the count)
      acc[id][1]++;

      // Return the object for the next iteration
      return acc;
    }, {}));
    
    // Return the `out` object for the next iteration
    return out;

  }, {});

}

console.log(getCounts(data));


3 commentaires

Merci beaucoup pour la réponse, le commentaire du code m'a également aidé à comprendre merci.


@BIPLAPBHATTARAI, j'ai mis à jour ma réponse pour vous montrer comment cela peut être réalisé en une seule opération plutôt que plusieurs.


Merci beaucoup @andy, votre réponse propre et commentée m'a aidé et peut aider les autres plus tard. Merci.



0
votes

const data = [
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Rishi Ranabhat",
    project: "ABC"
  },
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Biplap Bhattarai",
    project: "DEF"
  },
  {
    billed: "No",
    designation: "SE",
    involvement: "Part Time",
    name: "Ram k",
    project: "DEF"
  }
];

const result = data.reduce((acc,cur) => {
  for(let k in cur) {
    if(!acc[k]) {
      acc[k] = [[cur[k], 1]];
    } else {
      const idx = acc[k].findIndex(e => e[0] === cur[k]);
      if(idx !== -1) {
        acc[k][idx][1]++
      } else {
        acc[k].push([cur[k], 1])
      }
    }
  }
  return acc;
}, {});

console.log(result)


2 commentaires

Merci beaucoup de réponse.


Pouvez-vous ajouter un commentaire en code pour ce qui se passe?