Как отформатировать дату, которая является значением в массиве объектов - PullRequest
2 голосов
/ 05 июля 2019

У меня есть массив объектов:

var exerciseLog = [{“date”:“2019-07-02T21:18:48.946Z”,“description”:“pull ups”,“duration”:“90”},{“date”:“2019-07-02T21:22:30.395Z”,“description”:“push ups”,“duration”:“90”},{“date”:“2019-07-02T22:19:37.790Z”,“description”:“push ups”,“duration”:“50”}]

Я хочу отформатировать дату, чтобы исключить время, чтобы дата отображалась либо как «ГГГГ-ММ-ДД», либо как «ГГГГ / ММ / ДД».

Я пробовал map, forEach, slice, splice.

exerciseLog = exerciseLog.forEach(x => x.date.toLocaleDateString());

Не работает в соответствующей части кода:

app.get("/api/exercise/log", function (req, res) {
    var userId = req.query.userId; 
    var from = req.query.from ? new Date(req.query.from) : new Date("1970-01-01");
    var to = req.query.to ? new Date(req.query.to) : new Date();

    User.findById(userId, function (err, doc) {
      if (!doc) {
        res.send({ "error": "userId not found" });
      } else {
        var exerciseLog = doc.exercises.sort((a, b) => a.date.getTime() - b.date.getTime())
          .filter(x => x.date >= from && x.date <= to);
        var limit = !isNaN(req.query.limit) ? req.query.limit : exerciseLog.length;
        exerciseLog = exerciseLog.slice(0, limit);
        exerciseLog = exerciseLog.forEach(x => x.date.toLocaleDateString());
        res.send({ "username": doc.username, "Exercise Count": exerciseLog.length, "Exercise Log": exerciseLog });
      }
    });
  });

Ошибка:

events.js:160
6:59 PM
      throw er; // Unhandled 'error' event
6:59 PM
      ^
6:59 PM
6:59 PM
TypeError: Cannot read property 'length' of undefined
6:59 PM
Jump to
at /app/server.js:138:77
6:59 PM
    at /rbd/pnpm-volume/52232b84-c31b-4266-9261-f25b6365dff7/node_modules/.registry.npmjs.org/mongoose/5.6.2/node_modules/mongoose/lib/model.js:4846:16
6:59 PM
    at /rbd/pnpm-volume/52232b84-c31b-4266-9261-f25b6365dff7/node_modules/.registry.npmjs.org/mongoose/5.6.2/node_modules/mongoose/lib/query.js:4283:12
6:59 PM
    at process.nextTick (/rbd/pnpm-volume/52232b84-c31b-4266-9261-f25b6365dff7/node_modules/.registry.npmjs.org/mongoose/5.6.2/node_modules/mongoose/lib/query.js:2776:28)
6:59 PM
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
6:59 PM
    at process._tickCallback (internal/process/next_tick.js:104:9)

Который указывает на эту строку:

var limit = !isNaN(req.query.limit) ? req.queery.limit : exerciseLog.length;

, но если я удалю код со строкой forEach, у меня не будет ошибок.

Полный код https://glitch.com/edit/#!/swamp-liquid?path=server.js:138:53.

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Ваша ошибка в том, что вы присваиваете возвращаемое значение от Array.prototype.forEach до exerciseLog.

Array.prototype.forEach ничего не возвращает.

Вы хотите использовать Array.prototype.map .

exerciseLog = exerciseLog.map(x => x.date.toLocaleDateString());

0 голосов
/ 05 июля 2019

@ Майлз Гровер и @ BlueWater86 спасибо за помощь. Я пробовал карту раньше, и она не работала, но теперь она работает.

exerciseLog = exerciseLog.map(x => x.date.toLocaleDateString());

вернул только отформатированные даты, поэтому мне пришлось сделать это, чтобы сохранить остальную информацию об объекте:

exerciseLog = exerciseLog.map(x => "description: " + x.description + ", duration: " + x.duration + ", date: " + x.date.toLocaleDateString());
0 голосов
/ 05 июля 2019
exerciseLog = exerciseLog.forEach(x => x.date.toLocaleDateString());

forEach() ничего не возвращает, поэтому вы устанавливаете exerciseLog на ноль или неопределенное значение. Если вместо этого вы используете map(), эта строка установит exerciseLog в новый массив, основанный на том, что возвращается в функции, которую вы передаете map().

Следующая проблема заключается в том, что кавычки в исходном фрагменте кода представляют собой фигурные кавычки - не знаю, откуда они берутся, но ничего не получится, пока они не станут одинарными или двойными прямыми кавычками.

Я думаю, что последняя проблема в том, что x.date уже является строкой даты, а не объектом Date, поэтому toLocaleDateString() не будет работать с ней. Вы можете просто использовать x.date, или если вам нужно преобразовать дату в другой язык, вы бы сделали что-то вроде new Date(x.date).toLocaleDateString().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...