Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除nodejs中参数对象的属性_Javascript_Node.js - Fatal编程技术网

Javascript 删除nodejs中参数对象的属性

Javascript 删除nodejs中参数对象的属性,javascript,node.js,Javascript,Node.js,似乎我无法从nodejs中的另一个承诺中删除对象参数的属性 说我写 Person.save().exec().then(function(err, object){ create(object) // Lets assume object looks like -> {person : "don"}; }) create: function(object){ delete object.person; console.log(object) // It still has

似乎我无法从nodejs中的另一个承诺中删除对象参数的属性

说我写

Person.save().exec().then(function(err, object){

  create(object) // Lets assume object looks like -> {person : "don"};
})

create: function(object){
  delete object.person;
  console.log(object) // It still has this name property

}
However, If I do a deep copy inside of nodejs code's create call it deleted that property.
相反,如果我写的是

function a(){ let abc = { person: "don"}; xyz(abc)}
function xyz(param){
 delete param.person;
 console.log(param); ... It logs an empty object. 
}
a()

它在不执行深度复制的情况下完成了这一任务。这是什么原因

我认为这是由于MongoDB/Mongoose(看起来您正在使用)对象的工作方式

您可以通过调用
.toObject()
将Mongoose对象转换为常规JS对象。例如:

Person.save().exec().then(function(err, person){

  delete person.name; // won't work

  var newPerson = person.toObject(); // newPerson is now a regular JS object
  delete newPerson.name; // should work
  console.log(newPerson.name); // should return undefined
});

这里的代码太少,我们看不清到底发生了什么。向承诺添加自定义属性通常是一件坏事,因为承诺通常是链接的(新承诺总是从旧承诺创建的,因此很难保持相同的对象)。此外,
create(object)
不会为
create:function()定义调用类似show的方法。而且,
save.then(function(err,object){
也不是真正承诺的
.then()
处理程序的签名。
.then()
处理程序只传递了一个参数。是的,它不是。我将编写精确的代码注意,
.name
是某些类型对象(如函数对象)的保留属性名并且具有不允许更改的默认配置。当您执行
删除对象.name;
操作时,您是否正在尝试删除
.name
属性?还是正在尝试删除名在
name
变量中的属性?如果您可以成功地从副本中删除该属性,但不能从原始副本中删除,则您的数据库必须已将属性标记为不可配置或不可写。因此,只需使用可自由修改的副本即可。您可以通过执行
console.log(delete object.person)检查是否存在这种情况
。如果它返回
false
或引发异常,则该属性将被配置为无法删除。我觉得您是对的,因为我通过执行
var newObj=JSON.parse(JSON.stringify(myObj))
也可以工作,但效率较低的
.toObject()
功能,可为您提供所需的一切。