NodeJS создает новый массив из результата запроса MySQL

#javascript #jquery #mysql #arrays #node.js

#javascript #jquery #mysql #массивы #node.js

Вопрос:

В моем NodeJs проекте я хочу создать новую array форму MySQL результата запроса.

Это мой результат:

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

В этом результате два данных dayName совпадают.

Это мой ожидаемый результат

 [
    {   
        "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"
            }
        ]
    }
]
  

Мой код:

 CubbersAvailability.findAll(
    {
        where:{
            cubbersId:1,
            userId:2
        },
        attributes:['availabilityId', 'dayName', 'fromTime', 'toTime']
    }
).then(availabilityList =>{
    res.send(availabilityList);
    // code for create new array
}).catch(error=>{
    res.status(403).send({status: 'error', resCode:200, msg:'Internal Server Error...!', data:error});
});
  

Ответ №1:

Достаточно простой, но очень специфичный.

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

function createNewArray(source) {

  let output = [];

  source.forEach(entry => {

    let dayName = entry.dayName;
    let time = {
      "availabilityId": entry.availabilityId,
      "fromTime": entry.fromTime,
      "toTime": entry.toTime
    };

    if (output[dayName] === undefined) {
      output[dayName] = {
        "dayName": entry.dayName,
        "time": []
      };
    }

    output[dayName].time.push(time);

  });

  output.shift(); //shouldn't be needed, but since [0] is empty, necessary.

  return output;

}

console.log(createNewArray(source));  

Комментарии:

1. Спасибо за ваш код, он работает, но результат пришел по ссылке ibb.co/bHTkw6w

2. Но посмотрите мой ожидаемый результат, если то же самое dayName означает, что данные в том же массиве

3. ты там, братан

4. Исправлена структура, но по какой-то причине она добавляет undefined в начале, угадывая причину, по которой в массиве нет 0 , просто проверьте, есть ли запись undefined , и пропустите ее, если она есть.

5. Теперь он работает, братан, но в верхней части результата получаем undefined