I have an object and an array. Say:
const first = {
'key1': 'some date',
'key2': 'some date'
}
const second = ['key3', 'key4']
Then using spread syntax I want to combine then into single object. For each item in array I want to create new key value pair and put it inside this combined object. For now I am only able to return object from map function instead of key value pairs. How to change this?
const combined = {
...first,
...second.map(key => ({ [key]: new Date() })) // return key value instead of object
}
What I get:
{
'0': { key3: 'some date' },
'1': { key4: 'some date' },
key1: 'some date',
key2: 'some date'
}
What I want:
{
key1: 'some date',
key2: 'some date',
key3: 'some date',
key4: 'some date'
}
6
Answers
You can’t.
map
outputs an array (which each value is the result of passing the value at the matching index from the original array through a function). If you spread an array into an object you get the indexes (numbers) as property names and the values as values.If you want to start with an array and end up with an object then
map
is the wrong tool. Usereduce
instead.Something along the lines of:
Here is the working example:
You can use forEach and add each element in second array to result
you can try this :
As others have pointed out,
.map()
produces an array, so spreading that into an object will cause the array’s indexes to be added to the new object. Your approach can be modified though. Currently:produces:
Here, you can merge all the objects in this array into one object with the help of
Object.assign(...second.map(...))
:and then spread this object into your new object:
this can be further improved upon by passing
first
as an argument toObject.assign()
:Above, we merge
first
and all the objects from the mappedsecond
array into one object. Note that I’m passing{}
as the first argument to avoid mutating the originalfirst
object: