I have a problem, I don't know how to solve it, I will try not to give too much context and focus on the problem
A worker marks hours every day in his work, this is stored in the "dayli_data" array when the worker did not perform his hours then the "time_off" array is returned
I have two arrays that I don't know how to unify, when dayli_data brings the information I must check if the user_id is different from the time_off and if it is, I must bring the list of "...dayli_data" what it found in "...time_off"
So let's say that the user with ID = 957706 on 10/29/2022 marked 8 hours
[
{
user_id: 957706,
tracked: 8,
date: "2022-10-29"
},
{
user_id: 1171637,
tracked: 8,
date: "2022-10-29"
}
]
But on 10/31/2022 he don't mark hours, so in the record "dayli_data" it won't come (just a short example of the data)
[
{
user_id: 1171637,
tracked: 8,
date: "2022-10-29"
}
]
But it brings information in the time_off array
[{ user_id: 957706, reason: 'permission', tracked: 4, entry_date: "2022-10-31"}]
then I should be able to unify the arrays and return:
[
{
user_id: 957706,
tracked: 4,
reason: 'permission',
date_start: "2022-10-31",
date: "2022-10-31"
},
{
user_id: 1171637,
tracked: 7,
date: "2022-10-31"
}
]
How can I conditionally merge arrays?
I tried this:
let data_daily = [{
"id": 6583194952,
"date": "2022-10-31",
"user_id": 1171637,
"project_id": 2082652,
"task_id": 111873721,
"keyboard": 3891,
"mouse": 8714,
"overall": 11875,
"tracked": 29494,
"input_tracked": 29494,
"manual": 0,
"idle": 0,
"resumed": 0,
"billable": 17700,
"created_at": "2022-10-31T14:14:05.300434Z",
"updated_at": "2022-10-31T11:02:04.105898Z"
},
{
"id": 6583205067,
"date": "2022-10-31",
"user_id": 1762437,
"project_id": 2082652,
"task_id": 111407896,
"keyboard": 3843,
"mouse": 13066,
"overall": 15760,
"tracked": 29275,
"input_tracked": 29275,
"manual": 0,
"idle": 0,
"resumed": 0,
"billable": 29275,
"created_at": "2022-10-31T14:15:54.284572Z",
"updated_at": "2022-10-31T11:01:52.894533Z"
}
]
let time_off = [{
"user_id": 957963,
"date_start": "2022-10-31",
"date_end": "2022-11-05",
"rol": "DEV",
"reason": "Permiso",
"created_at": "2022-10-31T15:46:42 00:00",
"kpi": "permission",
"activity": 60,
"tracked": 4,
"user": {
"user_id": 957963,
"name": "Isaac xxx",
"email": "[email protected]",
"status": "active",
"created_at": "2022-10-31T06:36:42.898255Z",
"updated_at": "2022-10-31T13:59:08.095330Z",
"daily_hours": 8,
"username": "ISAAC XXX",
"time_work": "FULLTIME",
"job_position": "Junior"
}
},
{
"user_id": 957706,
"date_start": "2022-10-31",
"date_end": "2022-10-31",
"rol": "DEV",
"reason": "permission",
"created_at": "2022-10-31T06:18:25 00:00",
"kpi": "permission",
"activity": 60,
"tracked": 4,
"user": {
"user_id": 957706,
"name": "Cesar xxxx",
"email": "[email protected]",
"status": "active",
"created_at": "2022-10-31T19:41:27.759263Z",
"updated_at": "2022-10-31T15:20:46.296994Z",
"daily_hours": 8,
"username": "CESAR XXXX",
"time_work": "FULLTIME",
"job_position": "Junior "
}
}
]
const result = data_daily.map(element => {
return time_off.length > 0 ? { ...time_off
} : { ...element
}
});
console.log(result)
But it only returns the elements of the time_off. What am I doing wrong?
CodePudding user response:
From my understanding maybe you're looking for something like this:
let data_daily = [{
"user_id": 2,
"tracked": 7,
"date": "2022-10-31"
}]
let time_off = [{
"user_id": 1,
"reason": 'permission',
"tracked": 4,
"date_start": "2022-10-31"
}]
const result = time_off.reduce((resultArray, currTimeOff) => [...resultArray, currTimeOff], data_daily);
console.log(result)
Extra:
This is how JS reduce()
works.
CodePudding user response:
Just add in the same object that is returned the other object (which is element
) with the three dots ...
. The three dots allows us to instantly mapping an object's values into another. So, to fix it try the following .js
code:
let data_daily = [{
"user_id": 2,
"tracked": 7,
"date": 10/31/2022
}]
let time_off = [{ "user_id": 1, "reason": 'permission', "tracked": 4, "date_start": 10/31/2022}]
const result = data_daily.map(element => {
return time_off.length > 0 ? {...time_off, ...element } : { ...element }
});
console.log(result)