Ramesh S
Ramesh S

Reputation: 661

Nodejs create new array if same value

I have array result, if array values is same create new array list

This is my example array:

[
    {
        "dayName": 1,
        "time": {
            "availabilityId": 1,
            "fromTime": "05:30:00",
            "toTime": "10:00:00"
        }
    },
    {
        "dayName": 1,
        "time": {
            "availabilityId": 2,
            "fromTime": "10:30:00",
            "toTime": "06:00:00"
        }
    },
    {
        "dayName": 2,
        "time": {
            "availabilityId": 3,
            "fromTime": "16:30:00",
            "toTime": "22:00:00"
        }
    }
]

But i want this array like this

[
    {   
        "dayName": 1,
        "time":[
            {
                "availabilityId": 1,
                "fromTime": "05:30:00",
                "toTime": "10:00:00"
            },
            {
                "availabilityId": 2,
                "fromTime": "10:30:00",
                "toTime": "06:00:00"
            }
        ]
    },
    {   
        "dayName": 2,
        "time":[
            {
                "availabilityId": 3,
                "fromTime": "16:30:00",
                "toTime": "22:00:00"
            }
        ]
    }
]

Because in first 2 array dayName are same, so i want to create like array of array

This is code for i tried

CubbersAvailability.findAll(
{
    where:{
            cubbersId:cubbersId,
            userId:userId,
            status:1
        },
        attributes:['availabilityId', 'dayName', 'fromTime', 'toTime']
    }
).then(availabilityList =>{

    let list = [];
    availabilityList.forEach(result => {
       list.push({
            "dayName": result.dayName,
            "time": {
                "availabilityId": result.availabilityId,
                "fromTime": result.fromTime,
                "toTime": result.toTime
            }
        });
});

Upvotes: 1

Views: 482

Answers (2)

Ramesh S
Ramesh S

Reputation: 661

CubbersAvailability.findAll(
        {
            where:{
                cubbersId:cubbersId,
                userId:userId,
                status:1
            },
            attributes:['availabilityId', 'dayName', 'fromTime', 'toTime']
        }
    ).then(availabilityList =>{

        let list = [];
        availabilityList.forEach(result => {
            list.push({
                "dayName": result.dayName,
                "time": {
                    "availabilityId": result.availabilityId,
                    "fromTime": result.fromTime,
                    "toTime": result.toTime
                }
            });
        });

        let result = Object.values(list.reduce((c, {dayName,time}) => {
        c[dayName] = c[dayName] || {dayName,time: []};
        c[dayName].time.push(time);
        return c;
        }, {}));

        res.status(200).send({status: 'success', resCode:200, data:result});
    }).catch(error=>{
        res.status(403).send({status: 'error', resCode:200, msg:'Internal Server Error...!', data:error});
    });

Result

{
    "status": "success",
    "resCode": 200,
    "data": [
        {
            "dayName": 1,
            "time": [
                {
                    "availabilityId": 1,
                    "fromTime": "05:30:00",
                    "toTime": "10:00:00"
                },
                {
                    "availabilityId": 2,
                    "fromTime": "10:30:00",
                    "toTime": "06:00:00"
                }
            ]
        },
        {
            "dayName": 2,
            "time": [
                {
                    "availabilityId": 3,
                    "fromTime": "16:30:00",
                    "toTime": "22:00:00"
                }
            ]
        }
    ]
}

Upvotes: 1

Eddie
Eddie

Reputation: 26844

You can use reduce() to summarize the array into an object. Use Object.values to convert the object into an array.

let availabilityList = [{"dayName":1,"time":{"availabilityId":1,"fromTime":"05:30:00","toTime":"10:00:00"}},{"dayName":1,"time":{"availabilityId":2,"fromTime":"10:30:00","toTime":"06:00:00"}},{"dayName":2,"time":{"availabilityId":3,"fromTime":"16:30:00","toTime":"22:00:00"}}]

let result = Object.values(availabilityList.reduce((c, {dayName,time}) => {
  c[dayName] = c[dayName] || {dayName,time: []};
  c[dayName].time.push(time);
  return c;
}, {}));

console.log(result);

Upvotes: 3

Related Questions