【问题标题】:How to extract data from javascript object using map() in javascript?如何在 javascript 中使用 map() 从 javascript 对象中提取数据?
【发布时间】:2018-06-06 05:36:45
【问题描述】:

我正在尝试在 javascript 中使用 .map() 从 JSON 数据中提取数据。数据提取需要注入stacked bar chart

我正在尝试做与这个问题类似的事情:Stacked bar charts in Chart.js with JSON data,但在我的情况下,我希望每个赛季的总跑数将是条形图的高度,堆叠条形图的总高度将分为 3 堆。

查看堆积条形图:https://gionkunz.github.io/chartist-js/examples.html#stacked-bar

我的 JSON 数据:

        const batdata=[
    {"season":2008,
     "runs":25,
     "tournamentName":"XYZ"
    },
    {"season":2008,
     "runs":125,
     "tournamentName":"ABC"
    },
    {"season":2008,
     "runs":825,
     "tournamentName":"PQR"
    },
    {"season":2009,
     "runs":425,
     "tournamentName":"XYZ"
    },
    {"season":2009,
     "runs":255,
     "tournamentName":"ABC"
    },
    {"season":2010,
     "runs":275,
     "tournamentName":"XYZ"
    },
    {"season":2010,
     "runs":675,
     "tournamentName":"ABC"
    }
 ];
    export default batdata;

在chart.js中:

import React, { Component } from 'react';
import batdata from './batdata';

const uniq = a => [...new Set(a)]

const uniqueseason = uniq(

  batdata.map( newdata => newdata.season)

)

const runsperseason = batdata.map( newdata => {

})

class Chart extends Component {

  render(){
    return(
      <div>    

      </div>
    )}

}

export default Chart;

我使用.map() 获得独特的赛季,然后再次嵌套map() 以获得特定锦标赛名称的特定赛季的运行。如何解析数据外部 json 文件。最终数据应如下所示:

labels  = [2008,2009 2010]

Chartdata = [
    [25, 125, 825]  <--- Height of barchart = 825+25+125 and it will have 3 stacks because there are 3 tournamentName 
    [425, 255, 0]   <-- tournamentName: PQR not present in season 2009 so 3rd element zero
    [275, 675, 0]   <---tournamentName: PQR not present in season 2010 so 3rd element zero
]

我想把数据提取出来,以3个数组的形式存储在3个数据中:

1)Runs in season 2008 for tournamentName: XYZ,ABC, PQR
2)Runs in season 2009 for tournamentName: XYZ, ABC, PQR
3)Runs in season 2010 for tournamentName: XYZ, ABC, PQR

在将数据存储在 3 个不同的数组中之后,我们可以使用解构运算符 ... 来解压数组元素并填充图表数据。

【问题讨论】:

  • 您的图表数据分组是按 season 分组的,但是在 cmets 中您是按 tournamentName 分组的。请澄清这一点
  • @NikhilAggarwal 检查已编辑的问题。
  • PQR 不存在于 2009 赛季,所以第三个元素为零 - 第二个元素不应该为零吗?
  • @NikhilAggarwal 有 3 个赛季,每个赛季有 3 个锦标赛名称。
  • @NikhilAggarwal 第三场比赛名称是 PQR,因为 XYZ 和 ABC 都存在

标签: javascript reactjs


【解决方案1】:

你可以试试关注

const batdata=[{"season":2008,"runs":25,"tournamentName":"XYZ"},{"season":2008,"runs":125,"tournamentName":"ABC"},{"season":2008,"runs":825,"tournamentName":"PQR"},{"season":2009,"runs":425,"tournamentName":"XYZ"},{"season":2009,"runs":255,"tournamentName":"ABC"},{"season":2010,"runs":275,"tournamentName":"XYZ"},{"season":2010,"runs":675,"tournamentName":"ABC"}];
 
// Create set for unique tournament names
let tournaments = new Set();

/* Create an object with key as season name and value as object with 
** tournament name as key and run as value */
let obj = batdata.reduce((a,{season, runs, tournamentName}) => {
 a[season] = a[season] || {};
 a[season][[tournamentName]] = runs;
 tournaments.add(tournamentName);
  return a;
 },{});
 
// Create array from set of unique tournament names
 tournaments = Array.from(tournaments);
 
 // Get the labels - seasons
 let labels = Object.keys(obj);

 // Get the data
 let chartData = Object.values(obj);
 
 // Set runs as 0 for missing tournament in the season
 chartData = chartData.map((o) => tournaments.reduce((a,t) => [...a, o[t] ? o[t] : 0], []));

 console.log(labels);
 console.log(chartData);

【讨论】:

  • 我是 reduce() 的新手。我有几个疑问:1),{}); -> 这从reduce() 返回一个对象是真的吗? 2) 你能解释一下这个(a,{season, runs, tournamentName})。还有什么是上面代码中的累加器和 currentValue。如果您在答案中添加它会有所帮助
  • @stonerock - 减少返回 累加器。在上面的代码中,它位于两个地方——一个返回一个对象,第二个返回一个数组。因此,它可以是任何东西,具体取决于需要聚合的内容。在上述代码中,a 是累加器,{season, runs, tournamentName}currentValue。供参考 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 另外,请阅读developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 下的从作为函数参数传递的对象中解包字段部分。我希望它澄清
  • 这一行是什么 -> a[season] = a[season] || {}; ?
  • @stonerock - 这意味着第一次将a[season] 分配给一个空的{},因为a[season] 将不存在,然后在它存在时保持相同的值。就像设置默认值一样。
【解决方案2】:

您可以使用Array#reduce 创建映射来定义此类过滤对象。

let filterData = batdata.reduce((filter, value, index) => {

    if (filter[value.season]) {
        filter[value.season] = [...filter[value.season], value.season];
    } else {
        filter[value.season] = [value.season];
    }

    return filter;
}, {});

console.log(filterData)

工作codesandbox#demo

【讨论】:

  • 可以使用嵌套的.map().find()来完成,因为我不熟悉.reduce()
  • 可以。但是reduce可以通过map和find等数组工具来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2022-09-29
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多