使用本机JS映射对象并更改一个属性值
我希望能够返回结果集的数据,只是将date字段的格式更改为更可读,使所有其他数据保持不变。 我宁愿没有第三方库就这样做。
这是我到目前为止:
//Get all the Tasks function getAllTasks() { return models.gantt_tasks.findAll() .then(function(tasks){ let results = tasks.map(task => task.start_date = task.start_date.format("YYYY-MM-DD")); return results; }) .catch(function(e) { console.error(e); return e; }); }
我想在地图完成之前完成数据的返回。
.map()
不是修改现有数组对象属性的常用方法。 你可以做到这一点,但不是通常使用.map()
。 相反,这是创build一个新数组的一种方法。 一个.map()
callback函数会返回一个值,这些返回的值会被推送到一个新的数组中,该数组最后返回.map()
。
您的.map()
callback在将格式化date分配给它之后隐式返回task.start_date
。 这意味着你只创build一个格式化的date数组,而没有其余的原始task
对象。 如果您想在这里使用.map()
,则需要在将task
分配给task.start_date
后返回task
。
但是,您可能想要在.forEach()
.then()
callback中使用.forEach()
。 这是为这个工作做的方法:它只是遍历数组,并让你修改每个元素:
tasks.forEach( task => task.start_date = task.start_date.format("YYYY-MM-DD") ); return tasks;
另外,正如达斯汀所说,从.then()
返回一个值可能不会做你想要的。 最安全的方法就是在那儿做tasks
,或者调用另一个函数,把tasks
作为一个参数。 (虽然我承诺诺言有点生疏…)
两种方式都为我工作。 我想testing我将使用forEach()
直到我需要复制它,然后我将创build单独的function。
这是我结束了。
let moment = require('moment'); // Get all the Tasks function getAllTasks() { return models.gantt_tasks.findAll() .then(function(tasks) { tasks.forEach( task => task.start_date = moment(task.start_date).format("YYYY-MM-DD")); return tasks; }) .catch(function(e) { console.error(e); return e; }); } router.get('/data', (req, res) => getAllTasks() .then((tasks) => res.json({ data: tasks })) )
我结束了需要Moment库来转换我的dateSequelize不让我轻松操纵date。
这里的问题是,你正在返回从那个函数的callback数组,什么都不做。 您想要将callback传递给then函数,如下所示:
function doSomething(tasks) { let results = tasks.map(task => task.start_date = task.start_date.format("YYYY-MM-DD")); return results; } function getAllTasks(callBack) { models.gantt_tasks.findAll() .then(callback) .catch(function(e) { console.error(e); return e; }); } var results = getAllTasks(doSomething);