J'ai un tableau dans mon état:

projects: [
{ title: 'todo 1', person: 'Sam', status: 'ongoing'},
{ title: 'project', person: 'Jack', status: 'complete' },
{ title: 'Design video', person: 'Tim', status: 'complete' },
{ title: 'Create a forum', person: 'Jade', status: 'overdue' },
{ title: 'application', person: 'Jade', status: 'ongoing'},],

A partir de ce tableau (projets), je voudrais générer un nouveau tableau avec Javascript et obtenir ce résultat:

totalByPersonAndStatus : [
{person : 'Sam', complete: 0, ongoing: 1, overdue: 0 },
{person : 'Jack', complete: 1, ongoing: 0, overdue: 0 },
{person : 'Tim', complete: 1, ongoing: 0, overdue: 0 },
{person : 'Jade', complete: 0, ongoing: 1, overdue: 1 },]

Je l'ai essayé

totalProjectsByPersonAndStatus: state => {
state.projects.forEach(name => {
  state. totalByPersonAndStatus["name"] = name.person;
});

return state. totalByPersonAndStatus;

Le problème, si un make un console.log (this.totalByPersonAndStatus) j'ai un objet avec seulement les données de projects.name [name: "Jade", __ob__: Observer]

Pouvez-vous m'aider ? Je vous remercie

-3
Sam 27 janv. 2019 à 22:25

3 réponses

Meilleure réponse

Vous pouvez utiliser réduire

let projects =[{title:'todo1',person:'Sam',status:'ongoing'},{title:'project',person:'Jack',status:'complete'},{title:'Designvideo',person:'Tim',status:'complete'},{title:'Createaforum',person:'Jade',status:'overdue'},{title:'application',person:'Jade',status:'ongoing'},]

let desired = projects.reduce((output,{person,status}) => {
  if( output[person] ){
    output[person][status]++
  } else {
    output[person] = {
      person,
      complete: Number(status==='complete'),
      ongoing: Number(status==='ongoing'),
      overdue: Number(status==='overdue')
    }
  }
  return output;
},{})

console.log(Object.values(desired))
0
Code Maniac 27 janv. 2019 à 19:41

Créez un nouvel ensemble pour les personnes et les statuts en itérant dans les projets, un ensemble n'a que des valeurs uniques, les ensembles sont donc pratiques, parcourez votre ensemble de personnes en créant un nouvel objet avec tous les statuts initialisés à 0, puis parcourez les projets pour incrémenter les différents statuts qui s'appliquent. Cette méthode permet d'ajouter un nombre illimité de nouveaux statuts sans modifier le code - dynamique.

var people = new Set();
var status = new Set();   

projects.forEach((p)=>{
    people.add(p.person);
    status.add(p.status);
});

var totalByPersonAndStatus = [];

people.forEach((person)=>{
    let peeps = { "person": person };
    status.forEach((stat)=>{
        peeps[stat] = 0;
    });
    projects.forEach((project)=>{
        if (project.person === person) { peeps[project.status]++; }
    });
    totalByPersonAndStatus.push(peeps);
});
0
Harry Chilinguerian 27 janv. 2019 à 19:44

Vous pouvez utiliser reduce et déstructurant comme ceci:

const projects=[{title:'todo 1',person:'Sam',status:'ongoing'},{title:'project',person:'Jack',status:'complete'},{title:'Design video',person:'Tim',status:'complete'},{title:'Create a forum',person:'Jade',status:'overdue'},{title:'application',person:'Jade',status:'ongoing'}]

const merged = projects.reduce((acc,{person,status})=>{
  acc[person] = acc[person] || { person, ongoing:0, complete:0, overdue:0}
  acc[person][status]++;
  return acc;
},{})

console.log(Object.values(merged))

L'objectif est de créer un objet merged avec chaque person comme clé, puis d'incrémenter en fonction des statuts:

{
  "Sam": {
    "person": "Sam",
    "ongoing": 1,
    "complete": 0,
    "overdue": 0
  },
  "Jack": {

  }
  ...
}

Utilisez ensuite Object.values , pour obtenir le tableau final.

Vous pourriez en faire une doublure:

const projects=[{title:'todo 1',person:'Sam',status:'ongoing'},{title:'project',person:'Jack',status:'complete'},{title:'Design video',person:'Tim',status:'complete'},{title:'Create a forum',person:'Jade',status:'overdue'},{title:'application',person:'Jade',status:'ongoing'}],

output = Object.values(projects.reduce((a,{person,status})=>
  ((a[person] = a[person] || {person,ongoing:0,complete:0,overdue:0})[status]++,a),{}))

console.log(output)
0
adiga 27 janv. 2019 à 20:01