Javascript 映射返回具有未定义值的数组
我想用map从Mongo result(带有标记的数组)中删除属性Javascript 映射返回具有未定义值的数组,javascript,json,map-function,Javascript,Json,Map Function,我想用map从Mongo result(带有标记的数组)中删除属性\u id和\u v,但我总是在JSON result中得到带有null值的数组,而不是带有没有这两个属性的对象的数组 Marker.find().then(result => { const markers = result.map(marker => { delete marker['_id']; delete marker['__v']; }); res.s
\u id
和\u v
,但我总是在JSON result中得到带有null
值的数组,而不是带有没有这两个属性的对象的数组
Marker.find().then(result => {
const markers = result.map(marker => {
delete marker['_id'];
delete marker['__v'];
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
这就是返回的JSON在没有映射的情况下的外观:
以下是返回的JSON与映射的关系:
您需要在map函数中返回一些内容。 map函数返回一个新数组,其中包含从map函数返回的内容。如果不返回任何内容,则它是未定义的
Marker.find().then(result => {
const markers = result.map(marker => {
delete marker['_id'];
delete marker['__v'];
return marker;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
您需要在map函数中返回一些内容。 map函数返回一个新数组,其中包含从map函数返回的内容。如果不返回任何内容,则它是未定义的
Marker.find().then(result => {
const markers = result.map(marker => {
delete marker['_id'];
delete marker['__v'];
return marker;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
<> >而不是删除(并且基本上对结果数组进行突变),可以考虑下面的
Marker.find().then(result => {
const markers = result.map(marker => {
const { ['_id']: _, ['__v']: __, ...rest } = marker;
return rest;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
它将使用解构来创建标记的副本,并匹配先前删除的两个属性。所以<代码> < <代码>将包含代码< > ID ID/COD>的值,<代码> > <代码>将包含代码< >代码> v>代码>,您的对象的其余部分将包含在Marker.find().then(result => {
const markers = result.map(marker => {
const { ['_id']: _, ['__v']: __, ...rest } = marker;
return rest;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
它将使用解构来创建标记的副本,并匹配先前删除的两个属性。因此,
\uU
将包含\u id
的值,\uU
将包含\uU V
的值,对象的剩余部分将包含在rest
变量中,可以在以下位置筛选键值对:
o={“markers”:[{“id”:“5a7e266b6d7f6d00147bc269”,“id”:“DA27CBF8372AEB24CE20A21”,“x”:“25”,“y”:“37”,“timestamp”:2093355239,“u v”:0},{“id”:“5a7e2789c61cf90014d67e6b”,“id”:“5580D237F48899C6D82K”,“x”:“56”,“y”:“29”,“timestamp”:2138203308,“u v”:0}
stringify(o,(k,v)=>k[0]==''?void 0:v,2)
console.log(j)
可以在以下位置筛选键值对:
o={“markers”:[{“id”:“5a7e266b6d7f6d00147bc269”,“id”:“DA27CBF8372AEB24CE20A21”,“x”:“25”,“y”:“37”,“timestamp”:2093355239,“u v”:0},{“id”:“5a7e2789c61cf90014d67e6b”,“id”:“5580D237F48899C6D82K”,“x”:“56”,“y”:“29”,“timestamp”:2138203308,“u v”:0}
stringify(o,(k,v)=>k[0]==''?void 0:v,2)
console.log(j)
问题已解决。由于问题与猫鼬有关,所有给出的解决方案都不起作用。Mongoose返回的数据是MongooseDocument
,不可编辑。我只需要在查询中添加方法来获得可编辑的结果。之后,我用冰泡菜的溶液
Marker.find().lean().then(result => {
const markers = result.map(marker => {
const { ['_id']: _, ['__v']: __, ...rest } = marker;
return rest;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
问题解决了。由于问题与猫鼬有关,所有给出的解决方案都不起作用。Mongoose返回的数据是
MongooseDocument
,不可编辑。我只需要在查询中添加方法来获得可编辑的结果。之后,我用冰泡菜的溶液
Marker.find().lean().then(result => {
const markers = result.map(marker => {
const { ['_id']: _, ['__v']: __, ...rest } = marker;
return rest;
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
这是否也会改变原始对象(从
Marker.find()
返回的项)?@Caramiriel据我所知,map函数是不可变的。由于某种原因,这些属性仍然没有被删除,尽管我现在确实得到了它们。@Nikola“映射函数是不可变的” — 这不是重点。您正在对map
中的result
对象进行变异,这是您应该使用forEach
来替代的。或者,您可以将每个标记映射到一个新对象,该对象不包含\u id
和\u v
;这样你就不会变异结果
@Xufox我明白这一点。我误解了他的评论。这是否也改变了原始对象(从Marker.find()
)返回的项)?@Caramiriel据我所知,map函数是不可变的。由于某种原因,这些属性仍然没有被删除,尽管我现在确实得到了它们。@Nikola“映射函数是不可变的” — 这不是重点。您正在对map
中的result
对象进行变异,这是您应该使用forEach
来替代的。或者,您可以将每个标记映射到一个新对象,该对象不包含\u id
和\u v
;这样你就不会变异结果
@Xufox我明白这一点。我误解了他的评论。@Andreas是的,这是来自邮递员的美化JSON。@Andreas是的,这是来自邮递员的美化JSON。非常优雅的解决方案,谢谢。对于那些不知道的人;您需要使用节点8来使用扩展语法(当我尝试使用这个示例时,我得到了SyntaxError
,因为我有6.9.2
)。但是,此示例使对象充满了其他内容-$\uuuu
、是新的
和$init
属性,并没有解决问题。@Nikola它制作了一个完整的副本,这是真的,如果您只想要特定的内容,那么您应该使用解构来命名您想要接收的内容。关于节点8,您是对的,因为这是ES7解构的一部分,syntaxI现在还不太了解。我认为这应该返回不带\u id
和\u v
属性的整个对象,但相反,它返回带$\u
的对象,是新的和$init
(可能是元信息)以及\u id
和\u v
属性的对象。我知道解构是如何工作的,但这会使整个解决方案(考虑到嵌套级别)变得如此庞大,只需创建新对象并为其属性指定所需的属性就更容易了。@Nikola这可能是mongo处理的元数据,为什么不把记号笔拿出来,把它拆了?你不明白我的意思。我可以这样做,但是\u doc
的结构与当前返回的对象完全相同。我得到它后该怎么办?这就像两次解决同一个问题一样