【问题标题】:Add a Property to an Array of Objects from a Mongoose Find() query [duplicate]从 Mongoose Find() 查询向对象数组添加属性 [重复]
【发布时间】:2019-05-16 03:43:40
【问题描述】:

我正在从 Mongoose 查询中返回一组文档对象。该数组填充了预期的结果。

[{
    _id: 1,
    name: 'Mayonnaise'
},
{
    _id: 2,
    name: 'Gravy'
}]

我正在尝试仅在满足条件的情况下向某些对象添加新属性。我已经测试了这个元素,条件逻辑也按预期执行。我遍历上面的数组和另一个更大的数组来查找匹配的 id。当找到匹配项时,我需要添加一个属性,例如:

{isArchived: true}

到 find() 查询返回的数组中的对象。所以我最终应该是:

[{
    _id: 1,
    name: 'Mayonnaise'
},
{
    _id: 2,
    name: 'Gravy',
    isArchived: true
}]

问题是,无论我尝试什么,我都无法将新属性添加到数组中的特定对象上。

我在这里尝试了几乎所有“向对象添加属性”的答案,所以我准备开始扔东西了!!

感谢您的所有帮助!

编辑:整个路由器代码如下:

router.get('/edit/:id', ensureAuthenticated, (req, res) => {
  Menu.findOne({ _id: req.params.id })
  .populate('recipes')
  .then(menu => {
    Recipe.find({user: req.user.id}, function (err, allRecipes) {
      if(menu.user != req.user.id){
        req.flash('error_msg', 'Not Authorised!');
        res.redirect('/menus');
      } else {  
        //use momentjs to format dates to YYYY-MM-DD
        const vFromDate = moment(menu.validFrom).format('YYYY-DD-MM');
        const vToDate = moment(menu.validTo).format('YYYY-DD-MM');

        const selectedRecipeIds = menu.recipes.map(id => id._id);

        for (var i = 0; i < allRecipes.length; i++){
          for (var j = 0; j < selectedRecipeIds.length; j++){
            if (JSON.stringify(allRecipes[i]._id) == JSON.stringify(selectedRecipeIds[j]._id)) {
              allRecipes[i].isSelected = true
            }
          }
        }

        res.render('menus/edit', {
          menu,
          vFromDate,
          vToDate,
          allRecipes
        });
      }
    });
  })
});

【问题讨论】:

    标签: arrays node.js mongoose mongodb-query javascript-objects


    【解决方案1】:
    a = [{
        _id: 1,
        name: 'Mayonnaise'
    },
    {
        _id: 2,
        name: 'Gravy'
    }]
    

    a[0].isArchived = true

    【讨论】:

    • 感谢@mat 的回复,但恐怕没有喜悦。当我 console.log 整个数组时,它坚决不变!
    【解决方案2】:

    我认为您正在尝试改变来自响应的原始对象。 尝试对副本进行操作,如下所示:

    const allRecipiesCopy = [...allRecipies]
    

    然后循环遍历这个数组,并改变这些对象,而不是原始对象。

    【讨论】:

    • 谢谢@Tomasz,但恐怕没有运气。结果和以前一样。
    • 请在allRecipes[i].isSelected = true旁边放一个console.log,看看它是否在if语句中
    • 是的,确实如此。
    • allRecipes[i].isSelected = true 之后放一个console.log(allRecipes[i]) 并告诉我们输出结果
    猜你喜欢
    • 2015-03-25
    • 2021-11-09
    • 2018-12-22
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2017-02-10
    • 2013-06-08
    相关资源
    最近更新 更多