使用本机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);