我的快递项目有一个问题,从一天开始我无法解决。我无法将某些数据推入数组元素。让我演示我的代码和数据。
这是我的结果数据,这些数据来自mongodb:
library(dplyr)
bind_rows(warehouse, incoming) %>%
group_by(id) %>%
summarise(amount = sum(amount),
size = last(size))
# id amount size
# <chr> <int> <int>
#1 cymbals 5 24
#2 snares 5 15
#3 tom1 2 19
这是我的代码块:
result = {
name: 'Workflow',
steps:[
{ name: 'First Step',
assignee: '2cb56eadab3fbdc46dcb896e2ec68f33'
},
{
name: 'Second Step',
assignee: '1h374jab3fbdc46wer896e2ec687as'
}
],
__v: 0
}
运行代码块后,我的期望是:
var save = function(data, next) {
return new Promise(function(resolve) {
if (_.isEmpty(data._id)) {
Workflow.create(data, function (err, result) {
if (err) return next(err);
result.steps.forEach(function(step) {
step.detail = {
fullName: 'blablabla',
avatar: 'blablabla'
}
});
resolve(result);
});
}
}
}
我无法从结果数据中获得期望,也无法理解为什么未向步骤数组元素分配细节?
答案 0 :(得分:0)
您无法直接修改MongoDB给您的对象,它们已被冻结。
您可以复制对象并分配给副本:
const copy = {...result, steps: result.steps.map(step => {
const stepCopy = {...step};
stepCopy.detail =
fullName: 'blablabla',
avatar: 'blablabla'
};
return stepCopy;
})};
resolve(copy);
实际上可以更简洁地编写,但是它开始变得难以阅读:
const copy = {...result, steps: result.steps.map(step => (
{...step, detail: {
fullName: 'blablabla',
avatar: 'blablabla'
}}
)};
resolve(copy);
或者,因为我注意到您正在使用ES5语法(但可能是使用polyfills):
var copy = Object.assign({}, result);
copy.steps = copy.steps.map(function(step) {
var stepCopy = Object.assing({}, step);
stepCopy.detail = {
fullName: 'blablabla',
avatar: 'blablabla'
};
return stepCopy
)};
resolve(copy);
您将需要一个Object.assign
的polyfill(否则我会在代码中看到Underscore / Lodash,可以使用_.extend
来代替,实际上是将Object.assign
替换为{{1} }。
答案 1 :(得分:0)
您可以用另一种方式来做。在模型本身中添加局部对象。在模型定义中设置默认值。