React.js:使用Map函数将对象数组转换成Array数组取决于指定的属性

时间:2018-10-09 13:48:27

标签: javascript arrays reactjs

我正在尝试将我的数据重新格式化为适合React-Google-Chart的数据格式。

我当前的数据(保存为状态)是对象数组。如下所示:

[ { _id: 5bbbb89a1a3ab50bcbd750a3,
    desc: 'Market',
    total: 4000,
    amount: 1,
    timestamp: '10/8/2018  4:05:45  PM' },
  { _id: 5bbbb8ac1a3ab50bcbd750a7,
    desc: 'Deliver',
    total: 2000,
    amount: 1,
    timestamp: '10/8/2018  4:06:03  PM' },
  { _id: 5bbbb8ac1a3ab50bcbd750a8,
    desc: 'Market',
    total: 4000,
    amount: 1,
    timestamp: '10/8/2018  4:06:03  PM' },
  { _id: 5bbbb8ac1a3ab50bcbd750a9,
    desc: 'CPM',
    total: 14000,
    amount: 1,
    timestamp: '10/8/2018  4:06:03  PM' },
  { _id: 5bbca335ef3899eb5fcbed51,
    desc: 'Deliver',
    total: 4000,
    amount: 2,
    timestamp: '10/9/2018  8:46:44  AM' }]

我正在尝试将它们映射到以下内容:

[["Market", "2"], ["Deliver", 3], ["CPM", 1"]]

到目前为止,我一直在工作,但是没有按照我想要的方式工作。 让我解释一下:这部分数据是从备份中发送的,并保存为componentDidMount()中的状态。传达数据格式的函数将在初始渲染中调用。所以这是问题所在,如果不使用map函数,该函数将失败,因为在初始渲染期间,我的状态下没有数据。我发现的一种方法是使用地图功能,这样我就可以为我的初始渲染工作。

我到目前为止有什么:

mapBarArray(){
    if(this.state.history.length > 0){
        var barObject =[]
        for(var eachItem of this.state.history){
            var desc = eachItem.desc;
            var amount = eachItem.amount;
            if (!barObject[desc]) {
                barObject[desc] = [
                    desc,
                    amount
                ];
              }else{
                barObject[desc][1] +=1
              }
        }
    }
}

上面的代码将返回array对象的array。然后,我可以将每个对象的值放入最终数组中,这就是我想要的。但是,此方法不使用map,因此它将使初始渲染失败。

What I need help with:使用地图功能或任何类型的功能,以便在初始渲染期间进行传达,以便我可以使用它来绘制图表

1 个答案:

答案 0 :(得分:2)

这就像ggbarplot(ToothGrowth, x = "dose", y = "len", add = "mean_se", color = "supp", fill = "supp",position = position_dodge(0.8),add.params = list(group = "supp"))+ stat_compare_means(ref.group = "0.5", group.by = "supp",label = "p.signif")

编辑,我没有意识到您正在汇总金额。在这种情况下,我通常会按照以下方式进行操作:

data.map (({amount, desc}) => [desc, amount])

 map = data.reduce ((map, {amount, desc}) =>  {
   map [desc] = ~~map[desc] + ~~amount;
   return map;
},{});

Object.keys (map).map (k => [k,map[k]]);
let map = data.reduce ((map, {amount, desc}) =>  {
   map [desc] = ~~map[desc] + ~~amount;
   return map;
},{});
let mapped = Object.keys (map).map (k => [k,map[k]]);
console.log (JSON.stringify(mapped))