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.
3 Réponses :
Lot de façons de faire cela. Voici un moyen simple (pourrait être nettoyé, mais juste essayer de démo):
Comment créer un extrait de pile runnable?
@Adiga Savez-vous pourquoi la console réelle du navigateur montrerait la sortie correcte, mais pas la console de pseudo de Code Snippet Pseudo?
C'est un tableau associatif. L'extrait ne traite pas correctement. Op veut un tableau 2D comme sortie.
Merci beaucoup pour la réponse, mais les clés seront uniques et je n'ai présenté que sur cet exemple, il y aura une désignation et des projets. Merci beaucoup pour votre temps.
Itérate sur les données avec p> 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>. 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));
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.
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)Merci beaucoup de réponse.
Pouvez-vous ajouter un commentaire en code pour ce qui se passe?
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.