嵌套的javascript地图功能

时间:2018-03-04 09:40:30

标签: javascript node.js mongoose mean-stack

我正在处理带有把手的MEAN项目。我最初只是直接从我的数据库查询中使用数据并将其推送到我的车把视图。我不得不停止这一点,因为我想进行一些数据转换,我也听说这是更好的安全措施,因为它会删除你可能无意传递的数据。

无论如何,我无法为嵌套数据集获得正确的映射。

我的架构如下;

var approverSchema = mongoose.Schema({
    name: String,
    status: String,
    comment: String,
    date: Date
});

var taskSchema = mongoose.Schema({
    name: String,
    description: String,
    owner: String,
    businessUnit: String,
    status: String,  // draft, pending, approved, rejected
    approvalDue: Date,
    submitted: Date,
    approved: Date,
    approvers: [approverSchema]
});

我的代码是;

'use strict';
var Task = require('../models/task.js');

exports.home = function (req, res, next) {
    /* get tasks
    ------------------------------------------------------------------ */
    Task.find({
        owner: signedOnUser
    }, function (err, result) { //callback function
        if (err) {
            return console.log(err);
        } 
        var taskContext = {
            tasks: result.map(function(result){
                return {
                    name: result.name,
                    businessUnit: result.businessUnit,
                    status: result.status,
                    approvalDue: result.getDisplayDate(),
                    //approvers: result.approvers
                    approvers: result.approvers.map(function(result){
                        return {
                            name: result.approvers.name
                        };
                    })
                };
            })
        };
        res.render('home', {
            taskContext: taskContext,
        });
    });
};

我非常确定我的问题出在function(result),我通过了嵌套地图,但我似乎无法做到正确。

2 个答案:

答案 0 :(得分:0)

我猜你在地图函数中输了一个拼写错误:

'use strict';
var Task = require('../models/task.js');

exports.home = (req, res, next) => {
    /* get tasks
    ------------------------------------------------------------------ */
    Task.find({
        owner: signedOnUser
    }, function (err, results) { //callback function
        if (err) {
            return console.log(err);
        }

        const taskContext = {
          tasks: results.map((task) => {
              return {
                  name: task.name,
                  businessUnit: task.businessUnit,
                  status: task.status,
                  approvalDue: task.getDisplayDate(),
                  //approvers: task.approvers
                  approvers: task.approvers.map((approver) => {
                      return {
                          name: approver.name
                      };
                  })
              };
          })
      };
        res.render('home', {
            taskContext: taskContext,
        });
    });
};

在我的代码中,我为传递给每个map函数的参数使用了唯一的名称,以防止名称冲突 在第二个map函数中,我直接从name参数而不是approver调用了task.approvers.name属性。

答案 1 :(得分:0)

John Kennedy回答了这个问题,但您可以使用对象解构来清理代码。听起来你在服务器端,所以你可以使用更新的JavaScript语法。

it('console.log the text "hello"', () => {
  console.log = jest.fn();
  log('hello');
  // The first argument of the first call to the function was 'hello'
  expect(console.log.mock.calls[0][0]).toBe('hello');
});

解构语法从对象中取出属性。然后,您可以像const taskContext = { tasks: result.map(({name, businessUnit, status, getDisplayDate, approvers}) => ({name, businessUnit, status, approvalDue: getDisplayDate(), approvers: approvers.map(({name}) => {name})}) ); namebusinessUnit一样返回它们,它们将设置为statusname:namebusinessUnit:businessUnit,用于{ {1}}和status:status我们需要做一些额外的工作。

approvalDue更改为approvers也是一个不错的主意,因为现在它的approvers: approvers.map(({name}) => {name})字符串允许您使用approvers: approvers.map(({name}) => name)Array而不是Array.indexOf等。