【问题标题】:Difference between obj.key=value and obj.set(key, value)?obj.key=value 和 obj.set(key, value) 的区别?
【发布时间】:2019-04-20 21:33:33
【问题描述】:

因此,在尝试更新 mongoose 中的文档时,我意识到当我对使用 Model.findOne() 获得的文档执行 obj.key=value 时,它不会将属性分配给它的值。但是在尝试了 obj.set(key, value) 之后,该属性在文档中被分配给它的值。那为什么呢?通常,当我对对象执行第一种方法时,对象会获取属性。 .set() 函数是什么?跟猫鼬有关系吗?

//this works
async function updateItem(){
        let updatedItem = await Item.findOne({name:req.body.itemName});
        Object.entries(req.body).forEach(elem=>{
            if(elem[0]!=="itemName"){
                updatedItem.set(elem[0], elem[1]);
            };
        });
    };
    updateItem();
});


//this doesn't work
async function updateItem(){
        let updatedItem = await Item.findOne({name:req.body.itemName});
        Object.entries(req.body).forEach(elem=>{
            if(elem[0]!=="itemName"){
                updatedItem.elem[0] = elem[1];
            };
        });
    };
    updateItem();
});

【问题讨论】:

  • 我不确定它是否与反应式编程有关,但这里解释了它在 Vuejs 中的工作原理vuejs.org/v2/guide/reactivity.html
  • 我现在不明白了。这是因为 getter 和 setter。谢谢。

标签: javascript arrays json object ecmascript-6


【解决方案1】:

这意味着updatedItem 不是一个对象,它是一个Map,并且要向Map 添加项目需要使用get 方法。

要指出的另一件事是,当您设置updatedItem.elem[0] 时,您字面意思试图将密钥"elem[0]" 添加到updatedItem。要解决此问题,您需要使用带方括号的动态属性表示法:

updatedItem[elem[0]] = elem[1];

这会生成一个 valueelem[0] 的新键,而不是 keyelem[0]

【讨论】:

  • 感谢您的大力帮助。现在我知道要搜索什么,即使我从文档中看不懂。
  • 实际上,我要问的问题与此无关,但在尝试更新项目时让我感到不安。在输入Item.findOne() 之前,它是Item.find(),所以它返回了一个数组。我输入了updatedItem[elem[0]] = elem[1],它返回了类似[{key:value, key:value, key: value}, key:value, key:value] 的内容,但没有保存到数据库中。这个数组也是Map吗?
  • @EyePatch 因为一对方括号内有键值对,是的。
猜你喜欢
  • 2015-10-12
  • 2012-04-18
  • 2013-08-31
  • 2013-06-24
  • 2012-01-25
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多