उत्पन्न डेटा में recharts बार चार्ट का उपयोग कर सूची के डीटीओ

0

सवाल

मैं इस डीटीओ वस्तु से उत्पन्न बाकी एपीआई का उपयोग कर टाइपप्रति:

export interface BillingSummaryDTO {
    paid?: number,
    outstanding?: number,
    pastDue?: number,
    cancelled?: number,
    createdAt?: Moment | null,
}

export async function getBillingSummary(): Promise<AxiosResponse<BillingSummaryDTO[]>> {
  return await axios.get<BillingSummaryDTO[]>(
      `${baseUrl}/management/billing/summary`
  );
}

उदाहरण के लिए चार्ट:

import {
  BarChart,
  Bar,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  Legend,
} from "recharts";
import {Box} from "@material-ui/core";

const data = [
  {
    name: "Jan",
    Chargebacks: 4000,
    Transactions: 2400,
    USD: 2400,
  },
  {
    name: "Feb",
    Chargebacks: 3000,
    Transactions: 1398,
    USD: 2210,
  },
  {
    name: "Mar",
    Chargebacks: 2000,
    Transactions: 9800,
    USD: 2290,
  },
  {
    name: "Apr",
    Chargebacks: 2780,
    Transactions: 3908,
    USD: 2000,
  },
  {
    name: "May",
    Chargebacks: 1890,
    Transactions: 4800,
    USD: 2181,
  },
  {
    name: "Jun",
    Chargebacks: 2390,
    Transactions: 3800,
    USD: 2500,
  },
  {
    name: "Jul",
    Chargebacks: 3490,
    Transactions: 4300,
    USD: 2100,
  },
  {
    name: "Aug",
    Chargebacks: 3490,
    Transactions: 4300,
    USD: 2100,
  },
  {
    name: "Sep",
    Chargebacks: 3490,
    Transactions: 4300,
    USD: 2100,
  },
];

const useStyles = makeStyles((theme) =>
  createStyles({
    root: {
      flexGrow: 1,
    },
    paper: {
      padding: theme.spacing(2),
      textAlign: "center",
      color: theme.palette.text.secondary,
    },
  })
);

const usePaperStyles = makeStyles((theme) =>
  createStyles({
    root: {
      display: "flex",
      flexWrap: "wrap",
      "& > *": {
        margin: theme.spacing(1),
        width: theme.spacing(16),
        height: theme.spacing(16),
      },
    },
  })
);

const useTimelineStyles = makeStyles((theme) => ({
  paper: {
    padding: "6px 16px",
  },
  secondaryTail: {
    backgroundColor: theme.palette.secondary.main,
  },
}));

export default function Billing() {
  const [click, setClick] = useState(false);
  const closeMobileMenu = () => setClick(false);
  const classes = useStyles();
  const classesPaper = usePaperStyles();
  const classesTimeline = useTimelineStyles();

  return (
    <>
      <Grid container justifyContent="center" alignItems="center">
        <Grid item xs={11}>
          {/*Padding on the top*/}
          <Box m="5rem" />
        </Grid>

        <Grid item xs={12} >
          <h4 className="chart-label">Invoices Summary</h4>
          <BarChart
            width={1000}
            height={300}
            data={data}
            margin={{
              top: 5,
              right: 30,
              left: 20,
              bottom: 5,
            }}
            barSize={30}
          >
            <XAxis
              dataKey="name"
              scale="point"
              padding={{ left: 10, right: 10 }}
            />
            <YAxis />
            <Tooltip />
            <Legend />
            <CartesianGrid strokeDasharray="3 3" />
            <Bar
              dataKey="Transactions"
              fill="#8884d8"
              background={{ fill: "#eee" }}
            />
          </BarChart>
        </Grid>
      </Grid>
    </>
  );
}

मैं कैसे उपयोग कर सकते हैं डेटा से BillingSummaryDTO[] उत्पन्न करने के लिए चार्ट?

1

सबसे अच्छा जवाब

2

बनाने के एक समारोह है कि नक्शे पर BillingSummaryDTO[] और यह धर्मान्तरित में डेटा मॉडल (के रूप में दिखाई चर data) है कि आप निर्दिष्ट द्वारा खपत के लिए <BarChart/> एक वैध दृष्टिकोण है.

export interface BarChartDataModel {
  name: string,
  Chargebacks: number,
  Transactions: number,
  USD: number,
}

const data : BarChartDataModel []

इस डेटा में इस्तेमाल किया जाएगा <BarChart/> के रूप में


<BarChart
            data={data}
            // ....
          >
         // ...
 </BarChart>

इस तरह के एक समारोह का पालन करेंगे map reduce दृष्टिकोण के साथ एक छोटी सी मदद से एक JS तारीख प्रबंधन लाइब्रेरी की तरह momentjs

4 कदम समाधान

  1. व्यवस्था सभी बिलों का कालक्रम के अनुसार (पुराने बिल में पहली बार) के लिए आसान नक्शे को कम करने के बाद
  2. बाल्टी बिल द्वारा वर्ष बाल्टी में कहा जाता है 'वर्षवार-बाल्टी'
  3. बाल्टी के बिल में प्रत्येक वर्षवार-बाल्टी में बाल्टी 'नामक monthwise-बाल्टी'
  4. को कम करने, सभी के बिल में प्रत्येक monthwise-बाल्टी के लिए एक वस्तु के बाद BarChartDataModel इंटरफ़ेस. एक वस्तुओं के संग्रह के बाद BarChartDataModel इंटरफेस है data हम पारित करने के लिए हमारे <BarChart/> घटक
  5. इस का उपभोग वस्तु संग्रह inn हमारे <BarChart/> घटक

अपने कोड के लिए एक ही हो जाएगा :

export interface BillingSummaryDTO {
    paid?: number,
    outstanding?: number,
    pastDue?: number,
    cancelled?: number,
    createdAt?: Moment | null,
}

export interface BarChartDataModel {
  name: string,
  Chargebacks: number,
  Transactions: number,
  USD: number,
}

export async function getBillingSummary(): Promise<AxiosResponse<BillingSummaryDTO[]>> {
  const response = await axios.get<BillingSummaryDTO[]>(
      `${baseUrl}/management/billing/summary`
  );
  // STEP 1 : Chronological ordering. Oldest bills will show first
  const chronologicallyOrdered = response.sort((a:BillingSummaryDTO,b:BillingSummaryDTO)=> a.createdAt - b.createdAt )

  // STEP 2 : Bucket by year
  const groupByYear = chronologicallyOrdered.reduce((yearwiseBills : any, bill:BillingSummaryDTO, currIdx:number)) => 
     {
        const year = moment(bill.createdAt).year().toString()
        if(!yearwiseBills[year]){ 
          yearwiseBills[year] = []
        } 
        yearwiseBills[year].push(bill)
        return yearwiseBills
     }
  ,{})

  // STEP 3 : In each yearwise bucket -> bucket by month
  const groupByMonth = Object.keys(groupByYear).map((year, yearwiseBills) => yearwiseBills.reduce((monthwiseBills: any, bill:BillingSummaryDTO, currIdx:number)) => 
     {
        const moment = moment(bill.createdAt).month().toString()
        if(!yearAcc[month]){ 
          monthwiseBills[month] = []
        } 
        monthwiseBills[month].push(bill)
        return monthwiseBills
     }
  ,{}) );

 // STEP 4 : Reduce all bills in a monthwise bucket into a monthlyReport object and store all monthlyReport objects in an monthlyReportArray
 const monthlyReportArray:BarChartDataModel[] = Object.keys(groupByMonth).map((year, yearwiseBills) => 
   Object.keys(bills).map((month, monthwiseBills) => monthwiseBills.reduce((monthlyReport:BarChartDataModel,bill:BillingSummaryDTO) => {
    if(bill.cancelled){
      monthlyReport.Chargebacks++
    }else{
      monthlyReport.Transactions++,
      monthlyReport.USD += bill.paid
    }
    return monthlyReport
  },{
    name : moment(month, 'M').format('MMM')
    Transactions : 0,
    USD : 0,
    Chargebacks:0
   } )
 )


 // STEP 5 : Consume this as the "data" for the "<BarChart/>" component
 return monthlyReportArray
}
 

मैं bucketed द्वारा वर्ष पहली और फिर bucketed द्वारा माह के बजाय सीधे bucketing महीने के द्वारा, क्योंकि हम नहीं चाहते कि गठबंधन करने के लिए मासिक रिपोर्ट का कहना है "के मई 1997" और "के मई 1998 में" बस "हो सकता है" के लिए हमारे चार्ट. हम चाहते हैं उन्हें करने के लिए हो अलग

2021-11-24 05:49:15

मैं कई त्रुटियों. कर रहे हैं आप यकीन है कि यह होना चाहिए उचित समाधान है?
Peter Penzov

कर सकते हैं आप साझा करें अपने त्रुटियों ? विधि के लिए मानचित्र-कम सही है, तो तर्क चिपक जाती है । वाक्य रचना मुद्दों हो सकता है (मुख्य रूप से प्रकार-त्रुटियों की जाँच).
Ankit Sanghvi

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में