2017-07-19 97 views
0

我想我错过了“for in”语句的用法。 我有一个JSON文件从MongoDB的查询返回(的NodeJS +猫鼬),他的结构是这样的:奇怪的行为“在”声明(NodeJS)

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

在“在” cicle我得到的每一个文件,到另一个我要遍历数组“myArray”。问题是当我尝试迭代数组“myArray”。如果我重复它“对”的声明,我收到了很多其他的错误的东西,就像如果我循环查询返回的文件:如果我有一个经典的遍历它

[null,{},{"_id":"596f2f2ffbf8ab12bc8e5ee7","date":"1500458799794","questionId":4249,"__v":0,"myArray"["1234567","89","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","89","5678901"]

为什么? 代码如下:

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

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

'对... in'在所有迭代*对象属性*,不只是数组中indicies。包括任何原型链。人们通常不会以这种方式编写JavaScript(将数组视为对象),并且部分出于这个原因,使用不太容易出错的Array.prototype.map和Array.prototype.forEach函数。 –

回答

2

这是因为猫鼬返回一个文件,所以你看到的属性是那些进一步检查原型链。

我认为你要么需要的hasOwnProperty测试for ... in循环,使用经典的循环,或使用myArray.forEach(function (element) {});

+0

我想这取决于他描述的“错误的东西”。我不知道Mongoose文档中的数组是否是纯数组。如果他们肯定,与猫鼬无关:) –

+0

够公平的,我会删除我的评论。 –