首页 > 解决方案 > Reactjs,如何构建特定的 json 以在每月之间添加金额

问题描述

我的 API 中有这些数据:dataN

[{…}、{…}、{…}、{…}、{…}]

有关每个内部的更多详细信息:{...}

{
 date: "2018-01-01"
 import: 1

},
{
 date: "2018-03-03"
 import: "10"

},
{
 date: "2018-03-20"
 import: 10

},
{
 date: "2020-05-01"
 import: 10

},
{
 date: "2020-05-02"
 import: 10

},
{
 date: "2020-05-03"
 import: 10

},

我有一个函数正在提取所有找到的月份和年份,结果如下:

数组:[“2018-01”,“2018-03”,“2020-05”,......]

使用这个数组,我有另一个函数(工作)在日期之间寻找,并告诉我在给定日期之间进行了多少操作。

示例:在年月:2018-01 我只有 1 次操作,结果将是:

{
 date: "2018-01-01"
 import: 1

},

与例如相同的事情:“2020-05”我有 3 个操作,所以结果将是:{ date:“2020-05-01”import:10

},
{
 date: "2020-05-02"
 import: 10

},
{
 date: "2020-05-03"
 import: 10

},

现在我每个月都进行了操作并按年份排序,我想添加该月要执行的数量。

我的目标是每个月和年添加所有金额(它总是一个数字)(每个月都有一个总金额)例如:

"2018-01" 导入 "2018-03" 导入日期 2020-03-03 + 导入日期 2020-03-20 "2018-05" 导入日期 2020-05-01 + 导入日期 2020-05-01 + 导入日期:“2020-05-03

最终的json:

{
date : "2018-01"
import : 1
},
{
date : "2018-03"
import : 20
},
{
date : "2018-05"
import : 30
}

我有这个代码,但我真的不知道根据需要获取:

我真的很感谢任何帮助。

//["2018-01", "2018-02", "2018-03", "2018-04", "2018-05", .....]
        var Total = 0;
        array.forEach(function(item){
            //console.log(item)
            var a = moment(item);
            var start = a.format('YYYY-MM-DD')
            var b = a.add(30, 'days');
            var end = b.format('YYYY-MM-DD')


            console.log("procesing search between date : ",start , " and last date: ", end)
            DataFromApi.forEach((value, key) => {

                var EntreFechas = moment(value.compra_fecha_oper).isBetween(String(start), String(end) ); // true
                if ( EntreFechas === true && value.estado == "Finalizado" && value.moneda_crypto == TipoCrypto ){
                    console.log(key, " Value Date: ",value.compra_fecha_oper ,"Has result: ",  EntreFechas)

                    if (value.estado == "Finalizado" && value.moneda_crypto == TipoCrypto){

                        var jsonObjFinalizadas = 
                        { 
                        "fecha": value.compra_fecha_oper,
                        "importe":Total += parseFloat(value.compra_en_fiat),
                        }



                        ArrayFechasImportes.push(jsonObjFinalizadas)


                       }




                }

            });

          });

          console.log("El payaso: ",ArrayFechasImportes )

完整代码:

import React, { Component } from 'react';
import moment from "moment";

class RentabilidadMensual extends Component {


    //Se calcculará la rentablidad mensual obtenida.

    constructor (props){
        super(props)



          this.state ={

        }
    }


    render() {

        const DataFromApi = this.props.data;
        console.log("Datos de la API", this.props.data)
        var TipoCrypto = this.props.selectedcrypto;
        var DatosFechas = [];
        var ArrayFechasImportes = [];

        //del objeto se extrae las fechas del key: compra_fecha_oper y se genera un array: DatosFechas
        this.props.data.forEach((value, key) => {
            console.log("1-key =>", key, "1-value =>", value.compra_fecha_oper);

            DatosFechas.push(value.compra_fecha_oper)
            })

        console.log("Busco", DatosFechas)
         // Obtengo todas las fechas de la API: ["2020-04-29", "2020-04-19", ...]



        const getFirstAndLastDate = (DatosFechas) => {
            DatosFechas = DatosFechas.sort()
            //Devuelve primera fecha y última fecha
            return [DatosFechas[0], DatosFechas[DatosFechas.length - 1]]
          }

          console.log("First Date: ", getFirstAndLastDate(DatosFechas)[0], "Last Date: ", getFirstAndLastDate(DatosFechas)[1])



        function ListarLosMesesEntreDosFechas(inicio, fin) {

            var dateStart = moment(inicio);
            var dateEnd = moment(fin);
            var interim = dateStart.clone();
            var timeValues = [];

            while (dateEnd > interim || interim.format('M') === dateEnd.format('M')) {
               timeValues.push(interim.format('YYYY-MM'));
               interim.add(1,'month');
            }
            return timeValues
        }
        console.log("Valor de ListarLosMesesEntreDosFechas:", ListarLosMesesEntreDosFechas(getFirstAndLastDate(DatosFechas)[0], getFirstAndLastDate(DatosFechas)[1]) )

        //Para cada elemento del array con el datos de Año-mes se busca activiades en este mes y se suma.

        var array = ListarLosMesesEntreDosFechas(getFirstAndLastDate(DatosFechas)[0], getFirstAndLastDate(DatosFechas)[1])

        //["2018-01", "2018-02", "2018-03", "2018-04", "2018-05", .....]
        var Total = 0;
        array.forEach(function(item){
            //console.log(item)
            var a = moment(item);
            var start = a.format('YYYY-MM-DD')
            var b = a.add(30, 'days');
            var end = b.format('YYYY-MM-DD')


            console.log("procesing search between date : ",start , " and last date: ", end)
            DataFromApi.forEach((value, key) => {

                var EntreFechas = moment(value.compra_fecha_oper).isBetween(String(start), String(end) ); // true
                if ( EntreFechas === true && value.estado == "Finalizado" && value.moneda_crypto == TipoCrypto ){
                    console.log(key, " Value Date: ",value.compra_fecha_oper ,"Has result: ",  EntreFechas)

                    if (value.estado == "Finalizado" && value.moneda_crypto == TipoCrypto){

                        var jsonObjFinalizadas = 
                        { 
                        "fecha": value.compra_fecha_oper,
                        "importe":Total += parseFloat(value.compra_en_fiat),
                        }



                        ArrayFechasImportes.push(jsonObjFinalizadas)


                       }




                }

            });

          });

          console.log("El payaso: ",ArrayFechasImportes )



        return (
            <div>
                test...

            </div>
        );
    }
}

export default RentabilidadMensual;

标签: javascriptarraysjsonreactjs

解决方案


我已经完成了一项要求,如下所示。请尝试此示例并实施其他示例。

import React, {Component} from "react";

export default class JsonExample extends Component {

    state = {
        updatedJson: []
    };

    json = [
        {date: "2018-01-01", import: "XXX <--number"},
        {date: "2018-03-03", import: "XXX<--number"},
        {date: "2018-03-20", import: "XXX<--number"},
        {date: "2018-03-25", import: "XXX<--number"},
        {date: "2020-05-01", import: "XXX<--number"},
        {date: "2020-05-02", import: "XXX<--number"},
        {date: "2020-05-03", import: "XXX<--number"},
    ];

    componentDidMount() {
        let updatedJson = [];
        this.json.map(value => {
            let d = new Date(value.date);
            let yearMonth = ("0" + (d.getMonth() + 1)).slice(-2) + "-" + d.getFullYear();
            updatedJson.push(yearMonth);
        });
        this.setState({updatedJson: updatedJson});
    }

    render() {
        return (
            <div>
                {JSON.stringify(this.state.updatedJson)}
            </div>
        );
    }
}

根据需求更新完整代码

import React, {Component} from "react";

export default class JsonExample extends Component {

    state = {
        monthlyData: [],
        sortedData: [],
        monthlyTotalImport: []
    };

    json = [
        {date: "2018-01-01", import: 7},
        {date: "2018-01-21", import: 1},
        {date: "2018-03-03", import: 10},
        {date: "2018-03-20", import: 10},
        {date: "2020-05-01", import: 10},
        {date: "2017-12-01", import: 5},
        {date: "2020-05-02", import: 10},
        {date: "2020-05-03", import: 10},
    ];

    componentDidMount() {
        let data = [];
        this.json.map(value => {
            let d = new Date(value.date);
            data.push({...value, date2: d});
        });

        let sortedData = data.sort((a, b) => a.date2 - b.date2);
        console.log(sortedData, 'sorted');

        let monthlyData = [];
        sortedData.map(value => {
            let d = new Date(value.date);
            let yearMonth = ("0" + (d.getMonth() + 1)).slice(-2) + "-" + d.getFullYear();
            monthlyData.push({...value, yearMonth: yearMonth});
        });
        console.log(monthlyData, 'monthly data');

        let result = monthlyData.reduce((acc, item) => ({
            ...acc,
            [item.yearMonth]: (acc[item.yearMonth] || 0) + item.import
        }), {});
        this.setState({monthlyTotalImport: result});
        console.log(result, 'result');
    }

    render() {
        return (
            <div>
                {JSON.stringify(this.state.monthlyTotalImport)}
            </div>
        );
    }
}

推荐阅读