我在我的Angular 16应用程序中使用了顶点堆叠条形图.在这里,我在x轴上有4个类别,而条形图没有出现在正确的x轴标签中.

我的API响应数据:

let data = [
      {
        tenantName: 'OBC+',
        labelName: 'Application',
        total: 85,
        postiveTotal: '21',
        negativeTotal: '-64',
      },
      {
        tenantName: 'Discovery-world',
        labelName: 'Application',
        total: 194,
        postiveTotal: '119',
        negativeTotal: '-75',
      },
      {
        tenantName: 'OBC+',
        labelName: 'Channels',
        total: 40,
        postiveTotal: '0',
        negativeTotal: '-40',
      },
      {
        tenantName: 'OBC+',
        labelName: 'Wifi',
        total: 1,
        postiveTotal: '1',
        negativeTotal: '1',
      },
      {
        tenantName: 'Discovery-world',
        labelName: 'Channels',
        total: 59,
        postiveTotal: '0',
        negativeTotal: '-59',
      },
      {
        tenantName: 'Vidocon',
        labelName: 'Test',
        total: 30,
        postiveTotal: '10',
        negativeTotal: '-20',
      },
    ];

enter image description here

请判断上面的图像.API响应此处为tenantName: 'Vidocon',系列数据未进入正确的x轴标签.

它应该显示在"测试"x轴标签中,但却显示在"应用程序"x轴标签中.

Example Code

推荐答案

对于每个条形图,data数组应该包含大小基于x轴类别的值.

  1. 使用positiveTotalnegativeTotal字段将数据拆分为两个不同的对象.

  2. 获取categoryGroups,这是newDataname个值的array.例如:"OBC+正面"、"OBC+负面"、"探索世界正面"等.

  3. 根据上述概念,通过迭代categoryGroups数组形成subLabels数组,并与data形成对象.

let newData = data
  .map((x) => [
    {
      labelName: x.labelName,
      group: x.tenantName,
      name: x.tenantName + ' Positive',
      value: x.postiveTotal,
    },
    {
      labelName: x.labelName,
      group: x.tenantName,
      name: x.tenantName + ' Negative',
      value: x.negativeTotal,
    },
  ])
  .reduce((acc, cur) => {
    acc.push(cur[0]);
    acc.push(cur[1]);

    return acc;
  }, []);


let labels = [...new Set(data.map((x: any) => x.labelName))];
let categoryGroups = [...new Set(newData.map((x) => x.name))];

let subLabels = categoryGroups.map((category) => {
  return {
    group: newData.find(x => x.name == category).group,
    name: category,
    data: labels.map(
      (label) =>
        newData.find((z) => z.name == category && z.labelName == label)
          ?.value ?? 0
    ),
  };
});

Demo @ StackBlitz

enter image description here

Typescript相关问答推荐

Angular -使用Phone Directive将值粘贴到控件以格式化值时验证器不工作

TS 2339:属性切片不存在于类型DeliverableSignal产品[]上>'

为什么ESLint抱怨通用对象类型?

Angular中的其他服务仅获取默认值

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

为什么TypeScript失go 了类型推断,默认为any?''

如何使用一个字段输入对象,其中每个键只能是数组中对象的id属性,而数组是另一个字段?

在Reaction-Native-ReAnimated中不存在Animated.Value

有什么方法可以类型安全地包装import()函数吗?

在列表的指令中使用intersectionObservable隐藏按钮

如何过滤文字中的类对象联合类型?

从非文字数组(object.keys和array.map)派生联合类型

在TypeScript中扩展重载方法时出现问题

ANGLE NumberValueAccessor表单控件值更改订阅两次

打字错误TS2305:模块常量没有导出的成员

无法缩小深度嵌套对象props 的范围

有没有更干净的方法来更新**key of T**的值?

如何将对象的字符串文字属性用作同一对象中的键类型

如何知道使用TypeScript时是否在临时工作流内运行

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?