我有一个对象数组:
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”}]
我想格式化日期以排除时间,因此日期显示为“ YYYY-MM-DD”或“ YYYY / MM / DD”。
我已经尝试过地图,forEach,切片,拼接。
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。
答案 0 :(得分:1)
您的错误是因为您正在将返回值从Array.prototype.forEach分配给const (
xconst = 5
boolconst = false
)
。
Array.prototype.forEach不返回任何内容。
您要使用Array.prototype.map。
exerciseLog
答案 1 :(得分:0)
exerciseLog = exerciseLog.forEach(x => x.date.toLocaleDateString());
forEach()
不返回任何内容,因此您将exerciseLog
设置为null或未定义。如果改为使用map()
,则该行将根据传递给exerciseLog
的函数中返回的内容,将map()
设置为新数组。
下一个问题是,原始代码段中的引号是卷曲引号-不确定它是从哪里来的,但是除非是单引号或双引号,否则什么都行不通。
我认为最后一个问题是x.date
已经是日期字符串,而不是Date对象,因此toLocaleDateString()
不能在其上使用。您也许可以只使用x.date
,或者如果确实需要将日期转换为其他语言环境,则可以执行类似new Date(x.date).toLocaleDateString()
的操作。
答案 2 :(得分:0)
@Miles Grover和@ BlueWater86感谢您的帮助。我以前尝试过地图,但没有用,但现在可以了。
exerciseLog = exerciseLog.map(x => x.date.toLocaleDateString());
仅返回格式化的日期,因此我必须这样做以保留其余的对象信息:
exerciseLog = exerciseLog.map(x => "description: " + x.description + ", duration: " + x.duration + ", date: " + x.date.toLocaleDateString());