I have a nested object:
myObject {
"fshkj78gds": {
"name": "Joe",
"created_at": {
"nanoseconds": 745000000,
"seconds": 1645468219,
},
"updated_at": {
"nanoseconds": 0,
"seconds": 1645471800,
},
},
"gsdg987": {
"name": "Mike",
"created_at": {
"nanoseconds": 745000000,
"seconds": 1645468219,
},
"updated_at": {
"nanoseconds": 0,
"seconds": 1645471800,
},
},
}
I would like to convert created_at and updated_at in each nested object to only return the seconds instead as a number like so:
myObject {
"fshkj78gds": {
"name": "Joe",
"created_at": 1645468219,
"updated_at": 1645471800,
},
"gsdg987": {
"name": "Joe",
"created_at": 1645468219,
"updated_at": 1645471800,
},
}
I am thinking I will need a mix of map and Object.assign as well as spread operator?
So far I got to:
Object.assign({}, myObject, Object.values(myObject).map((nestedObject) =>
Object.assign({}, nestedObject, {...nestedObject, created_at: nestedObject.created_at.seconds})
))
But this generates an array of objects and doesn't keep the original structure. What's the proper way to do this?
Use forEach() to iterate over the values and then just reassign the properties.
Object.values(myObject).forEach(item => {
item.created_at = item.created_at.seconds;
item.updated_at = item.updated_at.seconds;
});
Using Object#fromEntries, Object#entries, and Array#map:
const myObject = {
"fshkj78gds": {
"name": "Joe",
"created_at": { "nanoseconds": 745000000, "seconds": 1645468219 },
"updated_at": { "nanoseconds": 0, "seconds": 1645471800 }
},
"gsdg987": {
"name": "Mike",
"created_at": { "nanoseconds": 745000000, "seconds": 1645468219 },
"updated_at": { "nanoseconds": 0, "seconds": 1645471800 }
}
};
const res = Object.fromEntries(
Object.entries(myObject).map(([ key, value ]) => ([
key,
{ ...value, 'created_at': value['created_at'].seconds, 'updated_at': value['updated_at'].seconds, }
]))
);
console.log(res);
for (let key in obj) {
obj[key].created_at = obj[key].created_at.seconds;
obj[key].updated_at = obj[key].updated_at.seconds;
}