【问题标题】:Strange behaviour "for in" statement (NodeJS) [duplicate]奇怪的行为“for in”语句(NodeJS)[重复]
【发布时间】:2017-12-24 15:39:00
【问题描述】:

我想我在使用“for in”语句时遗漏了一些东西。 我有一个从 mongoDB 查询(nodejs + mongoose)返回的 JSON 文档,他的结构如下:

  [{  
  "_id":"596f2f2ffbf8ab12bc8e5ee7",
  "date":"1500458799794",
  "questionId":4249,
  "__v":0,
  "myArray":[  
     "1234567",
     "8901234",
     "5678901"
     ]
  },
  {  
  "_id":"596f2f2ffbf8ab12bc8e5ee5",
  "date":"1500458799795",
  "questionId":4245,
  "__v":0,
  "myArray":[  
     "1234565",
     "5678905"
     ]
  }]

在“for in”cicle 中,我获取每个文档并进入另一个我想迭代数组“myArray”的文档。问题是当我尝试迭代数组“myArray”时。如果我用“for in”语句迭代它,我会收到很多其他错误的东西,比如如果我正在迭代查询返回的文档:

  [null,{},{"_id":"596f2f2ffbf8ab12bc8e5ee7","date":"1500458799794","questionId":4249,"__v":0,"myArray"["1234567","8901234","5678901"]},null,null,....,"myArray",true,[],{"caster":{"enumValues":[],"regExp":null,"path":"myArray","instance":"String","validators":[],"setters":[],"getters":[],"options":{},"_index":null},"path":"whoDislikes","instance":"Array"....etc etc... ]

如果我用经典的 for 语句迭代它,一切都很好: ["1234567","8901234","5678901"]

为什么? 代码如下:

  for(question in data){
      var myArray=data[question].myArray;
      console.log(JSON.stringify(myArray));   //this print ["1234567","8901234","5678901"]

      for(var i=0;i<myArray.length;i++){
         console.log(myArray[i]);   //this print ["1234567","8901234","5678901"]
       }
       for(element in myArray){
          console.log(myArray[element]);   //this print a lot of wrong stuff!
       }
  }

【问题讨论】:

  • for...in 迭代所有对象属性,而不仅仅是数组索引。包括原型链上的任何。人们通常不再以这种方式编写 JavaScript(将数组视为对象),而是使用不易出错的 Array.prototype.mapArray.prototype.forEach 函数,部分原因就是这个原因。

标签: javascript arrays node.js mongodb for-in-loop


【解决方案1】:

这是因为 Mongoose 返回一个文档,所以您看到的属性是原型链更上层的属性。

我认为您要么需要在 for...in 循环中进行 hasOwnProperty 测试,要么使用经典循环,要么使用 myArray.forEach(function (element) {});

【讨论】:

  • 我想这取决于他描述的“错误的东西”是什么。我不知道 Mongoose 文档中的数组是否是纯数组。如果他们确定,那么与猫鼬无关:)
  • 很公平,我会删除我的评论。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2013-07-13
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多