Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 映射返回具有未定义值的数组_Javascript_Json_Map Function - Fatal编程技术网

Javascript 映射返回具有未定义值的数组

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

我想用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.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>代码>,您的对象的其余部分将包含在REST <代码>变量

中,而不是删除(并且基本上更改您的结果数组),您可以考虑以下

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
的结构与当前返回的对象完全相同。我得到它后该怎么办?这就像两次解决同一个问题一样