删除不适用于NodeJs中的javascript对象

Him*_*edi 3 javascript mongoose mongodb node.js

我有一个事件对象,它是通过Mongoose插件从MongoDB中获取的.在这个对象中完成了一些操作,最后我想将这个对象保存在另一个具有相同结构的集合中.

为此,我需要删除所有属性从"_"或"__"开始,如"_id"和"__v".我编写的代码如下:

console.log(event);
console.log(delete event._id);
console.log(event);
Run Code Online (Sandbox Code Playgroud)

第1行和第3行使用_id属性打印相同的值.如果我删除一些其他属性,如"代码",同样的工作正常.这是完整的事件对象:

{ _id: 5a51019b211d740a174a1fba,
  __t: 'EventModel',
  code: '02',
  event: 'testMe',
  source: 'user',
  target: 'cronjob',
  __v: 0,
  params: 
     [ { key: 'Nodics',
         value: 'Framework',
         _id: 5a51019b211d740a174a1fbb } ],
  log: [ 'Published Successfully' ],
  hits: 1,
  type: 'ASYNC',
  state: 'FINISHED',
  testProperty: 'Nodics Framework',
  updatedDate: 2018-01-13T17:04:15.288Z,
  creationDate: 2018-01-13T17:04:15.288Z 
}
Run Code Online (Sandbox Code Playgroud)

请帮助我了解根本原因以及我如何处理这个问题.对我来说,它看起来直接或继承属性问题.但需要专家评论.

Tom*_*Tom 5

看起来你无法删除其中一些属性的原因是它们被定义为" 不可配置".但是,您的方法是次优的,因为它必然会改变其参数.永远不要改变一个论点.永远.

event您应该构建一个仅包含所需属性的新对象,而不是从中删除属性.

  • 您可以将要传输的特定属性列入白名单(并保存)
  • 您可以将您不想保存的特定属性列入黑名单
  • 您只能使用传输直接在对象上而不是原型链上的那些属性 Object.getOwnPropertyNames

像lodash这样的图书馆有糖来做这种事情:

// whitelist (using lodash)
var saveableEvent = _.pick(event, ['code', 'event', 'source', 'target', 'params', 'log', 'hits', 'type', 'state', 'testProperty', 'updatedDate', 'creationDate']);

// or blacklist (using lodash)
var saveableEvent = _.omit(event, ['_id', '__t', '__v']);

// only copy object's own properties (without lodash)
var saveableEvent = Object.getOwnPropertyNames(event)
.reduce(function(out, propName) {
    return Object.assign(out, event[propName])
}, {})

// create editable copy of object, then remove undesired props
var saveableEvent = event.toObject();
delete saveableEvent._id;
Run Code Online (Sandbox Code Playgroud)