Создать новый массив с количеством значений свойств - PullRequest
0 голосов
/ 27 января 2019

У меня есть массив в моем состоянии:

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'},],

Из этого массива (проекты) я хотел бы создать новый массив с Javascript и получить этот результат:

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 },]

Я попробовал

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

return state. totalByPersonAndStatus;

Проблема, если я сделаю console.log (this.totalByPersonAndStatus) У меня есть объект только с данными projects.name [name: "Jade", __ob__: Observer]

Вы можете мне помочь ?Спасибо

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Вы можете использовать reduce и деструктурировать следующим образом:

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

Цель состоит в том, чтобы создать объект merged с каждым person в качестве ключа и затем увеличить на основе состояний:

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

  }
  ...
}

Затем использоватьObject.values, чтобы получить окончательный массив.

Вы можете сделать его однострочным:

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 голосов
/ 27 января 2019

Создайте новый Набор для людей и статусов, выполняя итерации по проектам, набор имеет только уникальные значения, поэтому наборы удобны, перебирайте свой набор сотрудников, создавая новый объект со всеми статусами, инициализированными в 0, а затем выполняйте итерацию попроекты для увеличения различных статусов, которые применяются.Этот метод позволяет добавлять любое количество новых статусов без изменения кода - динамический.

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 голосов
/ 27 января 2019

Вы можете использовать уменьшить

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...