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

时间:2018-01-06 18:19:02

标签: javascript node.js mongodb mongoose

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

为此,我需要从' _'中删除所有属性。或者' __'喜欢' _id'和' __ v'。我编写的代码如下:

console.log(event);
console.log(delete event._id);
console.log(event);

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

{ _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 
}

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

7 个答案:

答案 0 :(得分:5)

看起来你无法删除其中一些属性的原因是它们被定义为“non-configurable”。但是,您的方法是次优的,因为它必然会改变其参数。 永远不要改变一个论点。如初。

您应该构建一个仅包含所需属性的新对象,而不是从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;

答案 1 :(得分:3)

您在查询时尝试过lean()吗? 喜欢find(query).lean()...检查这个http://blog.sandromartis.com/2016/05/08/mongoose-lean/ 这将允许您对对象执行任何操作。

其他方式可能是扩展根对象,并从中删除不需要的属性。你可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

示例:

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
delete copy._id;//or whatever you want
console.lg(copy);//check this doesnt have the _id;

由于 希望这有帮助

答案 2 :(得分:0)

古老的问题,但我把2美分扔进了争执。...

我遇到了这个问题,并使用Object.entries() + Array.reduce()来解决。这是我的看法:

// define dis-allowed keys and values
const disAllowedKeys = ['_id','__v','password'];
const disAllowedValues = [null, undefined, ''];

// our object, maybe a Mongoose model, or some API response
const someObject = {
  _id: 132456789,
  password: '$1$O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/',
  name: 'John Edward',
  age: 29,
  favoriteFood: null
}; 

// use reduce to create a new object with everything EXCEPT our dis-allowed keys and values!
const withOnlyGoodValues = Object.entries(someObject).reduce((ourNewObject, pair) => {
  const key = pair[0];
  const value = pair[1]; 
  if (
    disAllowedKeys.includes(key) === false &&
    disAllowedValues.includes(value) === false
  ){
    ourNewObject[key] = value; 
  }
  return ourNewObject; 
}, {}); 

// what we get back...
// {
//   name: 'John Edward',
//   age: 29
// }

// do something with the new object!
server.sendToClient(withOnlyGoodValues);

一旦您了解了它的工作原理,就可以对其进行更多的清理,尤其是使用一些精美的ES6语法时。为了演示起见,我特意尝试使其更具可读性。

阅读有关Object.entries()工作原理的文档:MDN - Object.entries()

阅读有关Array.reduce()工作原理的文档:MDN - Array.reduce()

答案 3 :(得分:0)

我最近有一个类似的问题。我使用loadash切断了数组中不需要的值,但是必须在获取的对象中使用.toObject()以便可以将其用作参数。像这样:

let resultExample = _.omit(exampleObject.toObject(), ['x', 'y', 'z']);

答案 4 :(得分:0)

在玩mongo对象的属性时,我发现了一种删除那些不必要属性的简单方法。

delete event._doc._id;
delete event._doc.__v;

答案 5 :(得分:-1)

use something like this 

 var event= event.toObject();
 delete event._id;

答案 6 :(得分:-2)

感谢您的快速帮助。您首先解决方案是有效的,但只有问题,属性是硬编码的,尽管我们可以使其可配置。 我试过的第二个解决方案,但无法产生任何影响。第三个是好的,但复制了很多属性,我们真的不需要。

除了这些之外,我尝试了以下解决方案并且现在可以使用,虽然它的性能代价很高但是它很好,直到我没有得到一个正确的:

let savableEvent = JSON.parse(JSON.stringify(event));
delete savableEvent._id;
delete savableEvent.__v;
delete savableEvent.__t;

如果我得到更好的东西,我会发布。