如何使用reduce函数将数组转换为对象?

问题描述 投票:0回答:1

我想用下面的函数将数组转换为对象 .reduce 函数转换成一个类型的对象。

{
"date": xxxx,
"amount": xxxx,
}

Insted of:

{01-2018: 0, 09-2019: 0, 02-2020: 0, 03-2020: 142.95999999999998, 04-2020: 652.78, …}

我想得到一个像这样的json:

{
"date": 01-2018,
"amount": 0,
},
{
"date": 09-2019,
"amount": 0,
},
{
"date": 02-2020,
"amount": 0,
},
{
"date": 03-2020,
"amount": 142.95999999999998,
},

这是我的代码

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


class RentabilidadMensual extends Component {

    //Este componente extendido es hijo de rentalidad y recibe de willmount los datos de la API.
    //Se calcculará la rentablidad mensual obtenida.

    constructor (props){
        super(props)


          this.state ={
            monthlyData: [],
            sortedData: [],
            monthlyTotalImport: [],
        }
    }


    componentWillMount() {

        var resultn = { NuevosDatosFinalizadas2: [] };
        var resultFinal = { NuevosDatosFinal: [] };


        function RentOperFinalizada (importe, Crypto, ValCryptoOperVenta , comisionCompra, comisionVenta, FechaCompra, FechaVenta){

            function NuevoImporte(){
              let tmpN = Number(ValCryptoOperVenta) * Number(Crypto)
              let R1 =  tmpN - (Number(comisionCompra) + Number(comisionVenta))
              return R1
            }

            let P = ((NuevoImporte() * 100)/Number(importe)) - 100 //Rentabilidad
            //console.log("voy a calcular: ",NuevoImporte() , " ", Number(importe) )
            let G = NuevoImporte() - Number(importe) //Cantidad ganada Neto
            let C = Number(comisionCompra) + Number(comisionVenta) //Comisiones Totales
            let D = moment(FechaVenta).diff( FechaCompra, 'days')
            console.log("Comisiones totales:", C)

            //R es Importe Total ganado en EUR
            //P es Rentabilidad en porcentaje
            //G es la cantidad ganada NETO en EUR.
            //C es Comisiones Totales en EUR
            //D es los días transcurrido entre la fecha compra y fecha venta.
            return [P.toFixed(2), G.toFixed(2), C.toFixed(2), D];
          }



        //Añadimos simplemente los campos:
        var DataFromApiTemp =  this.props.data.map((x) => Object.assign(
            x,
            x,
            {'RentabilidadPorcentaje' : ""}, {'CantidadGanadaNETO' : ""}, {'ComisionesTotales' : ""}, {'DiasTranscurrido' : ""}
            ));
            console.log("nuevo:",DataFromApiTemp )


            DataFromApiTemp.forEach((value, key) => {



            if (value.estado == "Finalizado" && value.moneda_crypto == this.props.selectedcrypto){

                    console.log("valor.estado: ", value.estado, key)

                    //Se llama la función para realizar los calculos.
                    var r = RentOperFinalizada (
                        value.compra_en_fiat, 
                        value.compra_crypto_cantidad, 
                        value.venta_crypto_valorOper , 
                        value.compra_gasto, 
                        value.venta_gasto, 
                        value.compra_fecha_oper, 
                        value.venta_fecha_oper)
                        //FIN

                        //Actualizamos los valores de estos campos:
                        value.RentabilidadPorcentaje = r[0];
                        value.CantidadGanadaNETO = r[1];
                        value.ComisionesTotales = r[2];
                        value.DiasTranscurrido = r[3];


                        resultn.NuevosDatosFinalizadas2.push(r);

                        console.log("Datos de la API", resultn.NuevosDatosFinalizadas2)

            }


        })

        console.log("dar algo modificado:", DataFromApiTemp)


        //Ya tenemos un nuevo Jason contruido donde se añadio previemnte las keys:
        //RentabilidadPorcentaje, CantidadGanadaNETO, ComisionesTotales, DiasTranscurrido
        let data = [];
        DataFromApiTemp.map(value => {
            let d = new Date(value.compra_fecha_oper);
            data.push({...value, date2: d});
        });


        //Ordenamos por fecha y creciente.
        let sortedData = data.sort((a, b) => a.date2 - b.date2);
        console.log(sortedData, 'sorted');


        //Añadimos nuevo campo yearMonth: "MES-FECHA"
        let monthlyData = [];
        sortedData.map(value => {
            let d = new Date(value.compra_fecha_oper);
            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) + Number(item.CantidadGanadaNETO)
        }), {});
        this.setState([{monthlyTotalImport: result}]);

        console.log("Result:",  result)

//        var jsonObjFinal = 
//        { 
//          "fecha": monthlyTotalImport,
//          "importe": result,
//        }
//
//        resultFinal.NuevosDatosFinal.push(jsonObjFinal);
//



    }

    render() {

        const DataFromApi = this.props.data;

        var TipoCrypto = this.props.selectedcrypto;


        return (
            <div>
                test...
                {JSON.stringify(this.state.monthlyTotalImport)}


            </div>
        );
    }
}

export default RentabilidadMensual;

谢谢你

DataFromApiTemp有这个值(例子)。

enter image description here

从@canberker尝试的代码,结果是。

enter image description here

我的目标是得到一个json格式的数据 包括我已经有的月份和金额的数据.

如果我有这个数据,我将能够图表这个结果.......

javascript json reactjs reduce
1个回答
1
投票
let aggregatedMonthlyData = monthlyData.reduce((acc, item) => ({
    ...acc,
    [item.yearMonth]: (acc[item.yearMonth] || 0) + Number(item.CantidadGanadaNETO)
    }), {}
);

const formatAggregatedMonthlyData = function(aggregatedMonthlyData) {
    const dateFieldName = 'date';
    const amountFieldName = 'amount';

    const result = [];
    for (let [date, amount] of Object.entries(aggregatedMonthlyData)) {
        result.push({
            [dateFieldName]: date,
            [amountFieldName]: amount
        });
    }
    return result;
}

const result = formatAggregatedMonthlyData(aggregatedMonthlyData);
console.log(result);

0
投票

假设你的输入值如下

const input = {"01-2018": 0, "09-2019": 0, "02-2020": 0, "03-2020":
142.95999999999998, ..}

下面的解决方案将有效

const transformData = input => 
   JSON.stringify(Object.entries(input).reduce((acc, [date, amount]) => [...acc, { date, amount }], []))


const output = transformData(input)

0
投票

使用Reduce方法,我们可以得到预期的结果。对象阵列

试试这个

let monthlyData=[{
 "year":"2019",
  "price":19
},{
 "year":"2020",
  "price":20
}]

let output = monthlyData.reduce((acc,current)=>{
    let item={
        "date":current.year,
        "amount":current.price
    }
    acc.push(item)
    return acc
  },
  []
)

console.log(output)
© www.soinside.com 2019 - 2024. All rights reserved.