簡體   English   中英

嵌套的JavaScript地圖功能

[英]Nested javascript map functions

我正在研究帶有把手的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) ,我正在傳遞嵌套映射,但是似乎無法正確處理。

我猜你在map函數中打了一個錯字:

'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函數中,我直接從approver參數而不是task.approvers.name調用了name屬性。

約翰·肯尼迪(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等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM