【问题标题】:Generate a new array with count of property values生成一个包含属性值计数的新数组
【发布时间】:2019-06-20 20:48:20
【问题描述】:

我的状态有一个数组:

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]的数据

你能帮帮我吗? 谢谢

【问题讨论】:

  • 到目前为止你尝试过什么?请提供代码。
  • 我认为答案是“是的,你可以得到帮助”以及“帮助我,通过展示你被困在哪一部分来帮助你”
  • 您向totalByPersonAndStatus 数组添加了一个name 字段,但您没有添加completeongoingoverdue 字段,也没有任何逻辑来指示它们的值应该如何到达在。

标签: javascript arrays object for-loop


【解决方案1】:

你可以使用reduce

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

【讨论】:

    【解决方案2】:

    通过遍历项目为人员和状态创建一个新集合,一个集合只有唯一的值,所以集合很方便,遍历你的人员集合创建一个所有状态初始化为 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);
    });
    

    【讨论】:

      【解决方案3】:

      您可以使用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)

      【讨论】:

      • 解构的绝妙使用
      猜你喜欢
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2011-02-02
      • 2023-01-14
      相关资源
      最近更新 更多