首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将下面的数组数据分组到上述结构中?

如何将下面的数组数据分组到上述结构中?
EN

Stack Overflow用户
提问于 2019-05-15 03:01:28
回答 2查看 37关注 0票数 0

目前我有一个数组数据结构,下面在"Actual“下面提到。我想以一种方式对它进行分组,以获得下面在“期望”中提到的所需结构。

我试着用lodash groupBy,mapToValues和map把它排列成我想要的结构,但是不能实现。

实际:

代码语言:javascript
复制
const candyDataSoldByEachDayInYear2000 = [
  {
    candyName: 'snickers',
    data: [{
      date: "2000-01-01", sold: 100
    }, {
      date: "2000-01-02", sold: 110
    }]
  }, {
    candyName: 'kitkat',
    data: [{
      date: "2000-01-01", sold: 80
    }, {
      date: "2000-01-02", sold: 70
    }]
  }, {
    candyName: 'twix',
    data: [{
      date: "2000-01-01", sold: 60
    }, {
      date: "2000-01-02", sold: 50
    }]
  }, {
    candyName: 'milkyway',
    data: [{
      date: "2000-01-01", sold: 60
    }, {
      date: "2000-01-02", sold: 70
    }]
  }, {
    candyName: 'skittles',
    data: [{
      date: "2000-01-01", sold: 120
    }, {
      date: "2000-01-02", sold: 110
    }]
  }];

期望值:

代码语言:javascript
复制
const candyDataSoldByEachDayInYear2000 = [
  {
    date: "2000-01-01",
    candySold: {
      snickers: 100,
      kitkat: 80,
      twix: 60,
      milkyway: 60,
      skittles: 120
    }
  },
  {
    date: "2000-01-02",
    candySold: {
      snickers: 110,
      kitkat: 70,
      twix: 50,
      milkyway: 70,
      skittles: 110
    }
  }
];

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-15 03:13:37

您可以结合使用Array.reduce()Array.forEach()创建一个带有Date键的对象,将糖果添加到相关日期,然后使用Array.values()转换为数组

代码语言:javascript
复制
const candyDataSoldByEachDayInYear2000 = [{"candyName":"snickers","data":[{"date":"2000-01-01","sold":100},{"date":"2000-01-02","sold":110}]},{"candyName":"kitkat","data":[{"date":"2000-01-01","sold":80},{"date":"2000-01-02","sold":70}]},{"candyName":"twix","data":[{"date":"2000-01-01","sold":60},{"date":"2000-01-02","sold":50}]},{"candyName":"milkyway","data":[{"date":"2000-01-01","sold":60},{"date":"2000-01-02","sold":70}]},{"candyName":"skittles","data":[{"date":"2000-01-01","sold":120},{"date":"2000-01-02","sold":110}]}];
  
const result = Object.values(candyDataSoldByEachDayInYear2000.reduce((r, { candyName, data }) => {
  data.forEach(({ date, sold }) => {
    if(!r[date]) r[date] = { date, candySold: {} };
    
    const cs = r[date].candySold;
    
    cs[candyName] = (cs[candyName] || 0) + sold;
  });

  return r;
}, {}));

console.log(result);

票数 1
EN

Stack Overflow用户

发布于 2019-05-15 03:18:04

这里有一种不使用库的方法:

代码语言:javascript
复制
const collectSales = (candy) => Object .entries (candy .reduce (
  (a, {candyName, data}) => data .reduce (
    (a, {date, sold, o = a[date] || {}, c = o[candyName] || 0}) => 
      ({...a, [date]: {...o, [candyName]: c + sold}}),
    a
  ),
  {}
))
.map ( ([date, candySold]) => ({date, candySold}) )

const candyDataSoldByEachDayInYear2000 = [{candyName:"snickers",data:[{date:"2000-01-01",sold:100},{date:"2000-01-02",sold:110}]},{candyName:"kitkat",data:[{date:"2000-01-01",sold:80},{date:"2000-01-02",sold:70}]},{candyName:"twix",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:50}]},{candyName:"milkyway",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:70}]},{candyName:"skittles",data:[{date:"2000-01-01",sold:120},{date:"2000-01-02",sold:110}]}];

console .log (
  collectSales (candyDataSoldByEachDayInYear2000)
)

此版本使用reduce将数据转换为如下形式:

代码语言:javascript
复制
{
    "2000-01-01": {
        kitkat: 80,
        milkyway: 60,
        skittles: 120,
        snickers: 100,
        twix: 60
    },
    "2000-01-02": {
        kitkat: 70,
        milkyway: 70,
        skittles: 110,
        snickers: 110,
        twix: 50
    }
}

然后用Object.entries包装结果,后跟一条简单的map语句。

更新

以上内容由本版本修改而来:

代码语言:javascript
复制
const collectSales = (candy) => Object.entries ( candy .reduce (
  (a, {candyName, data}) => data .reduce (
    (a, {date, sold}) => 
      ({...a, [date]: {...(a[date] || {}), [candyName]: ((a[date] || {})[candyName] || 0) + sold}}),
    a
  ),
  {}
))
.map ( ([date, candySold]) => ({date, candySold}) )

const candyDataSoldByEachDayInYear2000 = [{candyName:"snickers",data:[{date:"2000-01-01",sold:100},{date:"2000-01-02",sold:110}]},{candyName:"kitkat",data:[{date:"2000-01-01",sold:80},{date:"2000-01-02",sold:70}]},{candyName:"twix",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:50}]},{candyName:"milkyway",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:70}]},{candyName:"skittles",data:[{date:"2000-01-01",sold:120},{date:"2000-01-02",sold:110}]}];

console .log (
  collectSales (candyDataSoldByEachDayInYear2000)
)

这是一个明确的清理,避免了一些丑陋的重复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56136943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档