简体   繁体   English

如何从嵌套对象重新计算 object 的数组?

[英]How to recalculate an array of object from nested objects?

I have an array of objects where Citems is an array of Objects.我有一个对象数组,其中 Citems 是一个对象数组。 Each object has status on or off and time.每个 object 都有状态开启或关闭以及时间。

[
{
  Chapter: [
    {
      Cname: 'chapter 1',
      Citems: [{status: 'on', time: 30},{status: 'on', time: 60}],
      
    },
    {
      Cname: 'chapter 2',
      Citems: [{status: 'on', time: 30},{status: 'off', time: 60}]
    }
  ],
  name: 'Something',
  description: 'jfdgljfgdfjgldfkjglfd'
},{
  Chapter: [
    {
      Cname: 'chapter 1',
      Citems: [{status: 'on', time: 30},{status: 'on', time: 60}],
      
    },
    {
      Cname: 'chapter 2',
      Citems: [{status: 'on', time: 30},{status: 'off', time: 60}]
    }
  ],
  name: 'Something',
  description: 'jfdgljfgdfjgldfkjglfd'
},{
  Chapter: [
    {
      Cname: 'chapter 1',
      Citems: [{status: 'on', time: 30},{status: 'on', time: 60}],
      
    },
    {
      Cname: 'chapter 2',
      Citems: [{status: 'on', time: 30},{status: 'off', time: 60}]
    }
  ],
  name: 'Something',
  description: 'jfdgljfgdfjgldfkjglfd'
}
]

I want to generate an array or object from it that show total time for each status like below我想从中生成一个数组或 object 来显示每个状态的总时间,如下所示

[{
on: 120,
off: 60
},
{
on: 120,
off: 60
},
{
on: 120,
off: 60
}]

I tried to use map and reduce in it by not getting the derired result我尝试使用 map 并通过没有得到 derired 结果来减少它

You were on the right track using map() and reduce() .您使用map()reduce()走在正确的轨道上。 An additional call to flatMap() and some destructuring brings it all together:flatMap()的额外调用和一些解构将它们组合在一起:

const result = data.map(({ Chapter }) => Chapter
  .flatMap(({ Citems }) => Citems)
  .reduce((a, { status, time }) => ({
    ...a,
    [status]: (a[status] || 0) + time
  }), {})
);

Complete snippet:完整片段:

 const data = [{ Chapter: [{ Cname: 'chapter 1', Citems: [{ status: 'on', time: 30 }, { status: 'on', time: 60 }], }, { Cname: 'chapter 2', Citems: [{ status: 'on', time: 30 }, { status: 'off', time: 60 }] } ], name: 'Something', description: 'jfdgljfgdfjgldfkjglfd' }, { Chapter: [{ Cname: 'chapter 1', Citems: [{ status: 'on', time: 30 }, { status: 'on', time: 60 }], }, { Cname: 'chapter 2', Citems: [{ status: 'on', time: 30 }, { status: 'off', time: 60 }] } ], name: 'Something', description: 'jfdgljfgdfjgldfkjglfd' }, { Chapter: [{ Cname: 'chapter 1', Citems: [{ status: 'on', time: 30 }, { status: 'on', time: 60 }], }, { Cname: 'chapter 2', Citems: [{ status: 'on', time: 30 }, { status: 'off', time: 60 }] } ], name: 'Something', description: 'jfdgljfgdfjgldfkjglfd' }]; const result = data.map(({ Chapter }) => Chapter.flatMap(({ Citems }) => Citems).reduce((a, { status, time }) => ({...a, [status]: (a[status] || 0) + time }), {}) ); console.log(result);

I made it using map and flatMap .我使用mapflatMap制作了它。

data.map(({ Chapter }) => {
  let on = 0;
  let off = 0;

  Chapter.flatMap(({ Citems }) => Citems).map((item) => {
    if (item.status === "on") {
      on += item.time;
    } else {
      off += item.time;
    }
  });

  return { on, off };
});

 const data = [ { Chapter: [ { Cname: "chapter 1", Citems: [ { status: "on", time: 30 }, { status: "on", time: 60 } ] }, { Cname: "chapter 2", Citems: [ { status: "on", time: 30 }, { status: "off", time: 60 } ] } ], name: "Something", description: "jfdgljfgdfjgldfkjglfd" }, { Chapter: [ { Cname: "chapter 1", Citems: [ { status: "on", time: 30 }, { status: "on", time: 60 } ] }, { Cname: "chapter 2", Citems: [ { status: "on", time: 30 }, { status: "off", time: 60 } ] } ], name: "Something", description: "jfdgljfgdfjgldfkjglfd" }, { Chapter: [ { Cname: "chapter 1", Citems: [ { status: "on", time: 30 }, { status: "on", time: 60 } ] }, { Cname: "chapter 2", Citems: [ { status: "on", time: 30 }, { status: "off", time: 60 } ] } ], name: "Something", description: "jfdgljfgdfjgldfkjglfd" } ]; const result = data.map(({ Chapter }) => { let on = 0; let off = 0; Chapter.flatMap(({ Citems }) => Citems).map((item) => { if (item.status === "on") { on += item.time; } else { off += item.time; } }); return { on, off }; }); console.log(result);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM