[英]Javascript Nested Functions Using Combination of Reduce, Map and Concat with an Array
[英]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})})
);
解構語法從對象中刪除屬性。 然后,您可以只返回它們,例如name
, businessUnit
和status
並將它們設置為name:name
, businessUnit:businessUnit
和status:status
,以進行approvalDue
和approvers
我們需要做一些額外的工作。
另外,將approvers: approvers.map(({name}) => {name})
更改為approvers: approvers.map(({name}) => name)
可能是一個好主意,因為現在它是一個字符串Array
它允許您使用Array.indexOf
和Array.includes
而不是Array.find
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.