嵌套 javascript 地图函数
Nested javascript map functions
我正在做一个带有车把的 MEAN 项目。我最初只是直接使用来自我的数据库查询的数据,并将其推送到我的 handlebars 视图。我不得不停止此操作,因为我想进行一些数据转换,我还听说这是更好的安全做法,因为它会删除您可能不打算传递的数据。
无论如何,我无法为嵌套数据集获得正确的映射。
我的架构如下;
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)
,我正在传递嵌套地图,但我似乎无法正确处理。
我猜你在地图函数中打错了字:
'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})})
);
解构语法从对象中取出属性。然后你可以 return 他们像 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
等等
我正在做一个带有车把的 MEAN 项目。我最初只是直接使用来自我的数据库查询的数据,并将其推送到我的 handlebars 视图。我不得不停止此操作,因为我想进行一些数据转换,我还听说这是更好的安全做法,因为它会删除您可能不打算传递的数据。
无论如何,我无法为嵌套数据集获得正确的映射。
我的架构如下;
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)
,我正在传递嵌套地图,但我似乎无法正确处理。
我猜你在地图函数中打错了字:
'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})})
);
解构语法从对象中取出属性。然后你可以 return 他们像 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
等等