Stucked right here! How can I iterate this array of objects saving the key of the dates (for example 10/06/2021)? and iterate the skills array of objects?
the array must see like:
const data = [
{
name: 10/06/2021,
sprint speed: "4.00",
stamina: "4.00",
acceleration: "4.00"
},
.....
....
...
]
I'm trying with:
Object.keys(element.dates).forEach((date) => {
if (normalizedSkillsObject[date]) {
let normalizedTemps = {
...normalizedSkillsObject[date],
...{ name: date, data: element.dates[date].skills },
};
normalizedSkillsObject = {...normalizedSkillsObject, [date]: normalizedTemps}
} else {
normalizedSkillsObject = {
...normalizedSkillsObject,
[date]: { name: date, data: element.dates[date].skills.forEach(s => s.name) },
};
}
});
But this is the output:
4 Answers 4
const json = [
{
dates: {
"10/06/2021": {
average: 4,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
"13/04/2021": {
average: 2.97,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
},
},
{
dates: {
"20/04/2021": {
average: 4,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
},
},
];
const result = json.flatMap(({ dates }) => {
return Object.entries(dates).map(([name, value]) =>
Object.assign({ name }, ...value.skills.map(({ name, avg }) => ({ [name]: avg })))
);
});
console.log(result);
answered Jun 11, 2021 at 3:04
Amr Salama
9901 gold badge7 silver badges21 bronze badges
Sign up to request clarification or add additional context in comments.
Comments
const obj = {
dates: {
"10/06/2021": {
skills: [
{ id: 1, name: "accel", avg: "4.0" },
{ id: 2, name: "sprint speed", avg: "4.0" },
{ id: 2, name: "agility", avg: "0.00" },
],
},
"10/07/2021": {
average: 4,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
},
};
const res = Object.entries(obj.dates).reduce(
(acc, [date, { skills }]) => [
...acc,
{
name: date,
...skills
.filter(({ avg }) => Number(avg)) // remove skill avg's that are 0
.reduce((a, { name, avg }) => ({ ...a, [name]: avg }), {}),
},
],
[]
);
console.log(res);
Comments
I don't have a way to test this - you didn't give data to work with, but it looks pretty straight forward. Post your data if this isn't right and I'll fine tune
let data = {}
for (const [date, props] of Object.entries(element.dates)) {
let tmpObj= {name: date};
props.skills
.filter( skill => ["sprint speed","stamina","acceleration"].contains(skill.name))
.forEach(sk => {tmpObj[sk.name] = sk.avg});
data.push(tmpObj);
}
console.log(data)
answered Jun 11, 2021 at 2:45
Kinglish
23.7k4 gold badges25 silver badges43 bronze badges
4 Comments
dillon
I don't believe there is supposed to be any filtering applied
Kinglish
It's only filtering the skills array to get the skills the OP requested in their expected output
the array must see like:...dillon
I think I see what you mean. OP was not very clear and I figured they didn't want to type the rest out. Maybe they don't want results that are 0...?
Kinglish
Yep. Well at any rate, OP has a few nearly identical solutions to choose from... :)
const obj = {
dates: {
"10/06/2021": {
skills: [
{ id: 1, name: "accel", avg: "4.0" },
{ id: 2, name: "sprint speed", avg: "4.0" },
{ id: 2, name: "agility", avg: "0.00" },
],
},
"10/07/2021": {
average: 4,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
},
};
const res = Object.entries(obj.dates).reduce(
(acc, [date, { skills }]) => [
...acc,
{
name: date,
...skills
.filter(({ avg }) => Number(avg)) // remove skill avg's that are 0
.reduce((a, { name, avg }) => ({ ...a, [name]: avg }), {}),
},
],
[]
);
console.log(res);
const obj = {
dates: {
"10/06/2021": {
skills: [
{ id: 1, name: "accel", avg: "4.0" },
{ id: 2, name: "sprint speed", avg: "4.0" },
{ id: 2, name: "agility", avg: "0.00" },
],
},
"10/07/2021": {
average: 4,
skills: [
{ id: "1", name: "acceleration", avg: "4.00" },
{ id: "2", name: "sprint speed", avg: "4.00" },
{ id: "3", name: "stamina", avg: "4.00" },
],
},
},
};
const res = Object.entries(obj.dates).reduce(
(acc, [date, { skills }]) => [
...acc,
{
name: date,
...skills
.filter(({ avg }) => Number(avg)) // remove skill avg's that are 0
.reduce((a, { name, avg }) => ({ ...a, [name]: avg }), {}),
},
],
[]
);
console.log(res);
Comments
lang-js
sprint speed,stamina, andaccelerationin your output OR do you only want skills where theavgstat is NOT '0.00'?