Map返回具有未定义值的数组

时间:2018-02-10 13:12:27

标签: javascript json map-function

我想从带有map的Mongo结果(带有标记的数组)中删除属性_id__v,但我总是在JSON结果中使用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看起来没有映射的方式:

{
    "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
    ]
}

4 个答案:

答案 0 :(得分:2)

您需要在地图功能中返回一些内容。 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);

答案 1 :(得分:1)

您可以考虑以下

,而不是删除(并基本上改变您的结果数组)
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变量中

答案 2 :(得分:0)

可以在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)




答案 3 :(得分:0)

问题解决了。由于问题与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);