【问题标题】:Group multiple attributes based on category JAVASCRIPT. Works for one but not all attributes根据类别 JAVASCRIPT 对多个属性进行分组。适用于一个但不是所有属性
【发布时间】:2020-06-16 02:48:45
【问题描述】:

我有以下 JSON 字符串,我正在尝试按类别对其进行分组。

例如:

[{
    "category": "Messaging",
    "data": [7433],
    "backgroundColor": "rgba(255, 99, 132, 0.2)",
    "borderColor": "rgba(255,99,132,1)",
    "borderWidth": 2
}, {
    "category": "Price Promo",
    "data": [774],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}, {
    "category": "Usability",
    "data": [5993],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}, {
    "category": "Messaging",
    "data": [7624],
    "backgroundColor": "rgba(255, 99, 132, 0.2)",
    "borderColor": "rgba(255,99,132,1)",
    "borderWidth": 2
}, {
    "category": "Price Promo",
    "data": [900],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}, {
    "category": "Usability",
    "data": [5865],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}, {
    "category": "Messaging",
    "data": [7161],
    "backgroundColor": "rgba(255, 99, 132, 0.2)",
    "borderColor": "rgba(255,99,132,1)",
    "borderWidth": 2
}, {
    "category": "Price Promo",
    "data": [1005],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}, {
    "category": "Usability",
    "data": [5940],
    "backgroundColor": "rgba(255, 159, 64, 0.2)",
    "borderColor": "rgba(255, 159, 64, 1)",
    "borderWidth": 2
}]

至(预期结果):

{
    label: 'Messaging',
    data: [7433, 7624, 7161],
    backgroundColor: [
      'rgba(255, 99, 132, 0.2)',
      'rgba(255, 99, 132, 0.2)',
      'rgba(255, 99, 132, 0.2)'
    ],
    borderColor: [
      'rgba(255,99,132,1)',
      'rgba(255,99,132,1)',
      'rgba(255,99,132,1)'
    ],
    borderWidth: 2
  }

共有三个类别。我如何在 javascript 中执行此操作:

下面的尝试代码,但这仅适用于数据属性,而不适用于背景颜色和边框颜色等:

for (var i = 0; i < stackBarData.length; i++) {
  var categoryName = stackBarData[i].category;
  if (!groups[categoryName]) {
    groups[categoryName] = [];
  }
  groups[categoryName].push(stackBarData[i].data);
}

stackBarData = [];
for (var categoryName in groups) {
  stackBarData.push({
    label: categoryName,
    data: groups[categoryName]
  });
}

dataSet = stackBarData.map(x => ({
  label: x.label,
  data: x.data.map(y => y[0])
}));

如何更改以上内容以在我的分组中包含背景颜色、边框颜色、边框宽度?

【问题讨论】:

  • 为什么borderWidth 在结果中是一个数字?如果输入对象没有相同的边框宽度怎么办?
  • 它总是有相同的边框宽度
  • data 总是一个只有一个元素的数组?
  • 是的数据总是有一个值,但是当我将它组合在一起时,它应该是 [X,Y,Z]

标签: javascript arrays


【解决方案1】:

您可以按类别分组并取出值以添加到数组中。

var json = '[{"category":"Messaging","data":[7433],"backgroundColor":"rgba(255, 99, 132, 0.2)","borderColor":"rgba(255,99,132,1)","borderWidth":2},{"category":"Price Promo","data":[774],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2},{"category":"Usability","data":[5993],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2},{"category":"Messaging","data":[7624],"backgroundColor":"rgba(255, 99, 132, 0.2)","borderColor":"rgba(255,99,132,1)","borderWidth":2},{"category":"Price Promo","data":[900],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2},{"category":"Usability","data":[5865],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2},{"category":"Messaging","data":[7161],"backgroundColor":"rgba(255, 99, 132, 0.2)","borderColor":"rgba(255,99,132,1)","borderWidth":2},{"category":"Price Promo","data":[1005],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2},{"category":"Usability","data":[5940],"backgroundColor":"rgba(255, 159, 64, 0.2)","borderColor":"rgba(255, 159, 64, 1)","borderWidth":2}]',
    result = Object.values(JSON
        .parse(json)
        .reduce((r, { category, borderWidth, ...o }) => {
            r[o.category] = r[o.category] || { category, data: [], backgroundColor: [], borderColor: [], borderWidth };
            Object.entries(o).forEach(([k, v]) => r[o.category][k] = (r[o.category][k] || []).concat(v));
            return r;
        }, {}));

console.log(result);

【讨论】:

    【解决方案2】:

    在第一个循环中创建您想要的完整对象,并将每个属性推送到相应的数组中。

    var groups = {};
    stackBarData.forEach(d => {
      var categoryName = d.category;
      if (!groups[d.category]) {
        groups[d.category] = {
          label: d.category,
          data: [],
          backgroundColor: [],
          borderColor: [],
          borderWidth: d.borderWidth
        };
      }
      groups[d.category].data.push(d.data[0]);
      groups[d.category].backgroundColor.push(d.backgroundColor);
      groups[d.category].borderColor.push(d.borderColor);
    });
    
    stackBarData = Object.values(groups);

    【讨论】:

    • 得到一个错误 ',' js 预计在 stackBarData 旁边
    • 抱歉,忽略了)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多