【问题标题】:Adding new pair to Javascript object dynamically动态向 Javascript 对象添加新对
【发布时间】:2016-02-08 12:45:10
【问题描述】:

Node.js 应用程序中,我有一个名为user 的对象,其中包含以下内容:

{
   name:'john',
   family:'jackson'
}

我想像这样动态添加一对:

user["city"] =  "new york";

但它不起作用!当我这样打印时:

console.log(user);

我看到的内容和上面一样:

{
   name:'john',
   family:'jackson'
}

但是当我打印这个时:

console.log(user.city);

它打印这个:

new york

但是为什么?我将此结果发送到浏览器,它仍然没有city 键/值!

更新:

在一个普通的 javascript 中,我解释的所有东西都有效。我的问题是当我使用节点 js 并使用 Mongoose 从数据库中获取一些数据后,如下所示:

Users.find({followings:{$elemMatch:{$in:[userID]}}}).exec(function(err, users){
     users[0]["city"] =  "new york"; // this doesn't work. this adds city to users but doesnt show in console.log(users[0])
});

但是为什么呢? users 是一个常规的 Javascript 对象。为什么我会出现这种行为?

【问题讨论】:

  • 这里的user 是什么?它是引用该对象的变量吗?
  • 是的,就是那个对象
  • 它可以在普通的旧 javascript 中运行,至少在我的 FF 控制台中是这样。我对 node.js 的了解还不够,无法进一步帮助您
  • 你能告诉我们你的完整代码吗?很难说为什么您的问题会出现在这里。看起来它应该按照我的方式工作。
  • @towerofnix:它的完整代码。我正在测试它。在节点端我可以访问城市值,但是当我将它发送到浏览器时,没有任何城市

标签: javascript json node.js mongoose


【解决方案1】:

我找出问题所在。当我进行猫鼬查询时,结果不是普通的 javascript 对象。使用精益()我可以告诉猫鼬跳过创建常规猫鼬模型。然后我改变了这个:

Users.find({followings:{$elemMatch:{$in:[userID]}}}).exec(function(err, users){
     users[0]["city"] =  "new york"; // this doesn't work. this adds city to users but doesnt show in console.log(users[0])
});

到这里:

Users.find({followings:{$elemMatch:{$in:[userID]}}}).lean().exec(function(err, users){
     users[0]["city"] =  "new york"; //works now!
});

而且它有效!

【讨论】:

  • lean()an 选项,但它会从结果对象中删除所有猫鼬特征。就个人而言,我认为您最好使用虚拟财产,但这完全取决于您的需求;例如,这适用于将数据拖入视图。
【解决方案2】:

试试这个:

var user = {'name':'John'};
user["city"] = "New York";
console.log(user);

你能试试这个简单的代码,看看哪些节点日志? 它应该吐出这个:

Object {name: "John", city: "New York"}

说明:

在我们的示例中,我们设置了一个具有属性name 和值John 的对象 第二行简单地添加了一个额外的属性city 和一个值New York 第三行记录带有新属性的对象

【讨论】:

  • 太棒了。现在我懂了! :) :P
  • 这与 OP 具​​体说的不起作用有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多