My objective is create this object:
{
name: string,
birthday: date
}
by this array:
const dataArray = [
{
"id": "name",
"type": "string"
},
{
"id": "birthday",
"type": "date"
}
]
So, I create a .map of the array, like this:
const inputsValues = {};
dataArray.map(item => {
if(item.type === "date"){
inputsValues[item.id] = new Date(item.value);
return; // this line is the problem
}
inputsValues[item.id] = item.value;
});
Is there a option to make a return in this function without use else?
const data = [
{id: "name", type: "string", value: "John"},
{id: "birthday", type: "date", value: "02.02.22"},
{id: "holiday", type: "date", value: "03.03.33"}
]
const inputsValues = data
// the "return" function - filters all non "date" items
.filter(item => item.type != "date")
// the map + inputsValue combination in one function
.reduce((values, item) => ({[item.id]: item.value, ...values}), {})
console.log(inputsValues)
Using map only to loop on an array, without using the returned array, is an anti pattern. The function map creates a new array by applying the given callback to all the values of an array ie dataArray. This is not your case because you want an object at the end, not an array.
Tu build your structure you should use, instead, a for of loop, a forEach or Array.reduce().
In case you just need to reduce your array to one single object, reduce is the best option:
const dataArray = [
{
"id": "name",
"type": "string"
},
{
"id": "birthday",
"type": "date"
}
];
const obj = dataArray.reduce((carry, { id, type, value = '' }) => {
carry[id] = type === 'date' ? new Date() : value;
return carry;
}, {}); // remember to initialize your carry, see reduce doc.
console.log(obj); // My reduced object { name: '', date: 2022-...}
const dataArray = [{
"id": "name",
"type": "string"
},
{
"id": "birthday",
"type": "date"
}
]
console.log(
dataArray.reduce((acc, curr) => {
acc[curr.id] = curr.type;
return acc;
}, {})
);