映射 returns 具有未定义值的数组
Map returns array with undefined values
我想用地图从 Mongo 结果(带有标记的数组)中删除属性 _id
和 __v
,但我总是得到带有 null
值的数组在 JSON 结果中,而不是数组中没有这两个属性的对象。
Marker.find().then(result => {
const markers = result.map(marker => {
delete marker['_id'];
delete marker['__v'];
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
这是返回的 JSON 在没有 映射的情况下 的样子:
{
"markers": [
{
"_id": "5a7e266b6d7f6d00147bc269",
"id": "da27cbf8372aaeb24ce20a21",
"x": "25",
"y": "37",
"timestamp": 2093355239,
"__v": 0
},
{
"_id": "5a7e2789c61cf90014d67e6b",
"id": "5580d237f486088499c6d82k",
"x": "56",
"y": "29",
"timestamp": 2138203308,
"__v": 0
},
]
}
这是返回的 JSON 与 和 映射的样子:
{
"markers": [
null,
null
]
}
您需要 return 在您的地图函数中添加一些内容。
映射函数 return 是一个新数组,其中包含您从映射函数 return 得到的内容。如果你 return 没有它是未定义的。
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);
这将使用解构来创建标记的副本,省略您之前删除的 2 个属性。因此 _
将包含 _id
的值,而 __
将包含 __V
的值,对象的其余部分将包含在 rest
变量中
可以在JSON.stringify
replacer parameter中过滤键值对:
o = {"markers":[{"_id":"5a7e266b6d7f6d00147bc269","id":"da27cbf8372aaeb24ce20a21","x":"25","y":"37","timestamp":2093355239,"__v":0},{"_id":"5a7e2789c61cf90014d67e6b","id":"5580d237f486088499c6d82k","x":"56","y":"29","timestamp":2138203308,"__v":0}]}
j = JSON.stringify(o, (k, v) => k[0] === '_' ? void 0 : v, 2)
console.log(j)
问题已解决。 None 的给定解决方案有效,因为问题与 Mongoose 有关。 Mongoose 返回的数据是 MongooseDocument
且不可编辑。我只需在查询中添加 lean()
方法即可获得可编辑的结果。之后,我使用了Icepickle的解决方案。
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);
我想用地图从 Mongo 结果(带有标记的数组)中删除属性 _id
和 __v
,但我总是得到带有 null
值的数组在 JSON 结果中,而不是数组中没有这两个属性的对象。
Marker.find().then(result => {
const markers = result.map(marker => {
delete marker['_id'];
delete marker['__v'];
});
res.send(JSON.stringify({ markers: markers }));
}).catch(next);
这是返回的 JSON 在没有 映射的情况下 的样子:
{
"markers": [
{
"_id": "5a7e266b6d7f6d00147bc269",
"id": "da27cbf8372aaeb24ce20a21",
"x": "25",
"y": "37",
"timestamp": 2093355239,
"__v": 0
},
{
"_id": "5a7e2789c61cf90014d67e6b",
"id": "5580d237f486088499c6d82k",
"x": "56",
"y": "29",
"timestamp": 2138203308,
"__v": 0
},
]
}
这是返回的 JSON 与 和 映射的样子:
{
"markers": [
null,
null
]
}
您需要 return 在您的地图函数中添加一些内容。 映射函数 return 是一个新数组,其中包含您从映射函数 return 得到的内容。如果你 return 没有它是未定义的。
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);
这将使用解构来创建标记的副本,省略您之前删除的 2 个属性。因此 _
将包含 _id
的值,而 __
将包含 __V
的值,对象的其余部分将包含在 rest
变量中
可以在JSON.stringify
replacer parameter中过滤键值对:
o = {"markers":[{"_id":"5a7e266b6d7f6d00147bc269","id":"da27cbf8372aaeb24ce20a21","x":"25","y":"37","timestamp":2093355239,"__v":0},{"_id":"5a7e2789c61cf90014d67e6b","id":"5580d237f486088499c6d82k","x":"56","y":"29","timestamp":2138203308,"__v":0}]}
j = JSON.stringify(o, (k, v) => k[0] === '_' ? void 0 : v, 2)
console.log(j)
问题已解决。 None 的给定解决方案有效,因为问题与 Mongoose 有关。 Mongoose 返回的数据是 MongooseDocument
且不可编辑。我只需在查询中添加 lean()
方法即可获得可编辑的结果。之后,我使用了Icepickle的解决方案。
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);