为了账号安全,请及时绑定邮箱和手机立即绑定

扁平化一些嵌套数据时遇到问题

扁平化一些嵌套数据时遇到问题

繁星淼淼 2022-11-11 13:25:32
我有一些如下所示的数据,我想获得类型 student 的所有正面、负面和中性的总和,所以我做了一个 d3.nest 方法,其中我将键用作学生,并返回值的总和提及。{Type: student, positive: 2, negative: 1, neutral:0}, {Type: student, positive: 1, negative: 1, neutral:0}, {Type: student, positive: 1, negative: 1, neutral:0}, {Type: student, positive: 1, negative: 2, neutral:0} 这是 d3.nest 的结果,在 .rollup return 语句中我指定了这样的值名称等positive: d3.sum(d,function(f){ return f.positive;})。下面是结果。`key: "student"     value: {positive: 5, negative: 5, neutral: 0}`但是,要绘制雷达图,我需要将数据展平,使其像下面这样一个级别,但我不知道该怎么做。我试着像下面显示的代码那样做,但一直出错,请你帮忙。{student: student, positive:5, negative:5, neutral:0}我已经尝试过这个 forEach 循环,但它没有用var flatData = []            subStudent.forEach(function(sub){                sub.value(function(subval){                    flatData.push({                        level: sub.key,                        value: subval.value                    });                });            });            console.log(JSON.stringify(flatData))
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

可能不需要d3.nest(),除非你心里有理由?


你可以用 reduce 来做到这一点(但我也会包括d3.nest()下面的例子):


const input = [

  {Type: 'student', positive: 2, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 2, neutral:0},

  {Type: 'other', positive: 2, negative: 0, neutral:1},

  {Type: 'other', positive: 1, negative: 1, neutral:0},

  {Type: 'other', positive: 1, negative: 1, neutral:0}

];


const output = Object.values(input.reduce((aggObj, item) => {

  

  if (!aggObj.hasOwnProperty(item.Type)) aggObj[item.Type] = item;

  else {

    for (let key in item){

      if (key != "Type") aggObj[item.Type][key] += item[key];

    } 

  }

  return aggObj

}, {}))


console.log(output)

输入:


[

  { Type: 'student', positive: 2, negative: 1, neutral:0 },

  { Type: 'student', positive: 1, negative: 1, neutral:0 },

  { Type: 'student', positive: 1, negative: 1, neutral:0 },

  { Type: 'student', positive: 1, negative: 2, neutral:0 },

  { Type: 'other',   positive: 2, negative: 0, neutral:1 },

  { Type: 'other',   positive: 1, negative: 1, neutral:0 },

  { Type: 'other',   positive: 1, negative: 1, neutral:0 }

]

输出:


[

  { Type: "student", positive: 5, negative: 5, neutral: 0 },

  { Type: "other",   positive: 4, negative: 2, neutral: 1 }

]

如果您需要/想要d3.nest()您可以这样做(相同的输入和输出):


const input = [

  {Type: 'student', positive: 2, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 1, neutral:0},

  {Type: 'student', positive: 1, negative: 2, neutral:0},

  {Type: 'other', positive: 2, negative: 0, neutral:1},

  {Type: 'other', positive: 1, negative: 1, neutral:0},

  {Type: 'other', positive: 1, negative: 1, neutral:0}

];


const nested = d3.nest()

  .key(d => d.Type)

  .rollup(d => ({

    positive: d3.sum(d, f => f.positive),

    negative: d3.sum(d, f => f.negative),

    neutral: d3.sum(d, f => f.neutral),

  }))  

  .entries(input)

  

const output = nested.map(item => {

  //console.log(item)

  return {Type: item.key, ...item.value}

})


console.log(output)

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>


查看完整回答
反对 回复 2022-11-11
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号