我想用下面的函数将数组转换为对象 .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有这个值(例子)。
从@canberker尝试的代码,结果是。
我的目标是得到一个json格式的数据 包括我已经有的月份和金额的数据.
如果我有这个数据,我将能够图表这个结果.......
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);
假设你的输入值如下
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)
使用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)