什么都没有分配给nodejs应用程序中的数组元素

时间:2018-10-14 15:35:14

标签: javascript arrays node.js object

我的快递项目有一个问题,从一天开始我无法解决。我无法将某些数据推入数组元素。让我演示我的代码和数据。

这是我的结果数据,这些数据来自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);
            });
        }
    }
}

我无法从结果数据中获得期望,也无法理解为什么未向步骤数组元素分配细节?

2 个答案:

答案 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)

您可以用另一种方式来做。在模型本身中添加局部对象。在模型定义中设置默认值。