#javascript #reactjs
#javascript #reactjs
Вопрос:
Я новичок в React. Я создаю свой первый проект. В проекте я использую api. Я получаю этот объект из api:
{
"cases": {
"10/6/20": 35806972,
"10/7/20": 36156226,
"10/8/20": 36515563,
"10/9/20": 36876248,
"10/10/20": 37105925
},
"deaths": {
"10/6/20": 1049875,
"10/7/20": 1055683,
"10/8/20": 1061877,
"10/9/20": 1068040,
"10/10/20": 1071388
},
"recovered": {
"10/6/20": 24834868,
"10/7/20": 25088883,
"10/8/20": 25306451,
"10/9/20": 25509379,
"10/10/20": 25610521
}
И я хочу превратить его в массив такого рода:
[{
"date":"10/6/20",
"cases": 35806972,
"deaths": 1049875,
"recovered":24834868
},
{},
{},
{},
{}
]
Каждый элемент в массиве будет объектом, состоящим из даты и количества пациентов, количества выздоравливающих и умирающих в одну и ту же дату.
я понятия не имею, как это сделать. Это не сложно, но я понятия не имею, как это реализовать
Комментарии:
1. Кстати, речь идет не о react, а только о JS)
Ответ №1:
Вы можете использовать Object.keys
и map
метод массива.
let data = {
"cases": {
"10/6/20": 35806972,
"10/7/20": 36156226,
"10/8/20": 36515563,
"10/9/20": 36876248,
"10/10/20": 37105925
},
"deaths": {
"10/6/20": 1049875,
"10/7/20": 1055683,
"10/8/20": 1061877,
"10/9/20": 1068040,
"10/10/20": 1071388
},
"recovered": {
"10/6/20": 24834868,
"10/7/20": 25088883,
"10/8/20": 25306451,
"10/9/20": 25509379,
"10/10/20": 25610521
}}
let keys = Object.keys(data.cases);
let modifiedData = keys.map(key => ({
date: key,
cases: data.cases[key],
deaths: data.deaths[key],
recovered: data.recovered[key]
}));
console.log("modifiedData", modifiedData)
Ответ №2:
Используя Array.reduce
, вы можете получить новый объект, сгруппированный по date
ключу из входных данных.
После получения grouped by date
объекта, используя Object.entries
amp; Array.map
, вы можете получить желаемый результат.
const input = {
"cases": {
"10/6/20": 35806972,
"10/7/20": 36156226,
"10/8/20": 36515563,
"10/9/20": 36876248,
"10/10/20": 37105925
},
"deaths": {
"10/6/20": 1049875,
"10/7/20": 1055683,
"10/8/20": 1061877,
"10/9/20": 1068040,
"10/10/20": 1071388
},
"recovered": {
"10/6/20": 24834868,
"10/7/20": 25088883,
"10/8/20": 25306451,
"10/9/20": 25509379,
"10/10/20": 25610521
}
};
const groupByDate = Object.entries(input).reduce((acc, cur) => {
Object.entries(cur[1]).forEach(([ date, value ]) => {
acc[date] ? acc[date][cur[0]] = value : acc[date] = { [cur[0]]: value };
});
return acc;
}, {});
const result = Object.entries(groupByDate).map(([ date, value ]) => ({
date,
...value
}));
console.log(result);
Ответ №3:
Перебирайте даты первого случайного элемента, так как все они имеют один и тот же список дат.
let data = _get_data();
let result = [];
for (let date in data.oranges) { // in Object.values(data)[0]
let obj = { date }; // shorthand of { "date": date }
for (let food in data) {
obj[food] = data[food][date];
}
result.push(obj);
}
console.log( result );
/***/
function _get_data() {
return {
"oranges": {
"10/6/20": 35806972,
"10/7/20": 36156226,
"10/8/20": 36515563,
"10/9/20": 36876248,
"10/10/20": 37105925
},
"bananas": {
"10/6/20": 1049875,
"10/7/20": 1055683,
"10/8/20": 1061877,
"10/9/20": 1068040,
"10/10/20": 1071388
},
"potatoes": {
"10/6/20": 24834868,
"10/7/20": 25088883,
"10/8/20": 25306451,
"10/9/20": 25509379,
"10/10/20": 25610521
}
};
}
Ответ №4:
Немного длинный, но вот он:
const data = {
cases: {
'10/6/20': 35806972,
'10/7/20': 36156226,
'10/8/20': 36515563,
'10/9/20': 36876248,
'10/10/20': 37105925,
},
deaths: {
'10/6/20': 1049875,
'10/7/20': 1055683,
'10/8/20': 1061877,
'10/9/20': 1068040,
'10/10/20': 1071388,
},
recovered: {
'10/6/20': 24834868,
'10/7/20': 25088883,
'10/8/20': 25306451,
'10/9/20': 25509379,
'10/10/20': 25610521,
},
};
// 5. Get all the values from the reduce to have an array instead of an object
const newData = Object.values(
// 1. Loop over all the keys in the object
Object.keys(data).reduce((all, key) => {
// 2. Loop over all the dates in the current object at the current key
Object.keys(data[key]).forEach((date) => {
// 3. Check if in the 'all' object there is an key for the current date if not create one with date inside
all[date] = all[date] || { date: date };
// 4. Inside the all object at the current date and then at the current key add the data at current key in the current date
all[date][key] = data[key][date];
});
return all;
}, [])
);
console.warn(newData);
Ответ №5:
const data = {
"cases": {
"10/6/20": 35806972,
"10/7/20": 36156226,
"10/8/20": 36515563,
"10/9/20": 36876248,
"10/10/20": 37105925
},
"deaths": {
"10/6/20": 1049875,
"10/7/20": 1055683,
"10/8/20": 1061877,
"10/9/20": 1068040,
"10/10/20": 1071388
},
"recovered": {
"10/6/20": 24834868,
"10/7/20": 25088883,
"10/8/20": 25306451,
"10/9/20": 25509379,
"10/10/20": 25610521
}};
const dataArray = [];
Object.keys(data.cases).map((date)=>{
dataArray.push({
date,
cases: data.cases[date],
deaths:data.deaths[date],
recovered:data.recovered[date],
})
})
console.log(dataArray);
Ответ №6:
Существуют разные способы получения результата, который вы ищете. Вот один из них, который я использовал Object.keys
, Object.entries
и Object.values
вместе с Array.forEach
let data = {cases:{'10/6/20':35806972,'10/7/20':36156226,'10/8/20':36515563,'10/9/20':36876248,'10/10/20':37105925},deaths:{'10/6/20':1049875,'10/7/20':1055683,'10/8/20':1061877,'10/9/20':1068040,'10/10/20':1071388},recovered:{'10/6/20':24834868,'10/7/20':25088883,'10/8/20':25306451,'10/9/20':25509379,'10/10/20':25610521}};
const formatData = (data) => {
const finalRes = {};
Object.keys(data).forEach(key => {
Object.entries(data[key]).forEach(([date, val]) => {
//Creating/Updating the object with key as `date` in the
//finalRes object with the other properties such as `cases`, `deaths` and `recovered`
finalRes[date] = {
...finalRes[date],
date,
[key]: val
}
})
});
//Finally, converting the object values to an array
return Object.values(finalRes);
}
console.log(formatData(data));
.as-console-wrapper {
max-height: 100% !important;
top: 0;
}