【问题标题】:Nested javascript map functions嵌套的javascript地图函数
【发布时间】:2018-08-12 03:16:07
【问题描述】:

我正在做一个带有车把的 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),我正在传递嵌套地图,但我似乎无法正确处理。

【问题讨论】:

  • 你不是返回一个对象吗? result.getDisplayDate() 是如何工作的?你的map 函数应该返回({name:result.name})
  • 为了清楚起见,我只是添加了完整的代码。谢谢大家
  • result.getDisplayDate() 仍应为 undefined,除非以某种方式定义
  • 嗨 Pavlo,谢谢,这不是问题所在。我已将 getDisplayDate 定义为我的架构中的一种方法。

标签: javascript node.js mongoose mean-stack


【解决方案1】:

我猜你在地图功能中打错了:

'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 函数中,我直接从approver 参数而不是task.approvers.name 调用了name 属性。

【讨论】:

  • 所以我更改了作用域变量名称,因为它们会导致冲突。第一个映射的result 参数也被用作第二个映射的参数。
  • 谢谢,我已经扩展了我在原始帖子中提供的代码。 taskContext 分配包含在一个数据库查询中,该查询传递回(结果),所以我不清楚如何实现您的解决方案。
  • @PaulCurtis,我已经用你提供的扩展代码更新了我的答案。
【解决方案2】:

John Kennedy 回答了这个问题,但您可以使用对象解构稍微清理一下代码。听起来您在服务器端工作,因此您可以使用更新的 JavaScript 语法。

const taskContext = {
  tasks: result.map(({name, businessUnit, status, getDisplayDate, approvers}) => 
                      ({name, 
                        businessUnit, 
                        status, 
                        approvalDue: getDisplayDate(),
                        approvers: approvers.map(({name}) => {name})})
                   );

解构语法从对象中取出属性。然后你可以像namebusinessUnitstatus一样返回它们,它们将被设置为name:namebusinessUnit:businessUnitstatus:status,对于approvalDueapprovers我们需要做一点额外的工作。

另外,将approvers: approvers.map(({name}) => {name}) 更改为approvers: approvers.map(({name}) => name) 可能是个好主意,因为现在它是字符串的Array,允许您使用Array.indexOfArray.includes 而不是Array.find 等。

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2019-05-23
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多