2015-10-16 60 views
1

我正在循环一个对象(我也尝试过使用数组)并构建一个url列表。我试图枚举使用for ...并重复使用,但我不断失去命令。保持列表的顺序node.js

var Model = require('./model'); 
     var Scraper = require('./scraper'); 
     var Pages = []; 
     function generateUrls(limit) { 
      var url = 'http://www.weatheronline.co.uk/SouthAfrica/'; 
      var urls = []; 

      Cities = { 
    'Windhoek' : 'Windhoek', 
    'GraaffReinet' : 'GraaffReinet', 
    'Queenstown' : 'Queenstown', 
    'Bhisho' : 'Bhisho', 
}; 
    }; 

     for (City in Cities) { 
     urls.push(url + Cities[City]); 
     } 
     return urls; 
    } 
    // store all urls in a global variable 
    Pages = generateUrls(); 
    function wizard() { 
     // if the Pages array is empty, we are Done!! 
     if (!Pages.length) { 
     return console.log('Done!!!!'); 
     } 

我该如何保持订单。在我刮掉一些天气数据后,我在本地主机上显示数据表。我用mongo,express和jade来使用node.js。

这里是创建表的玉代码。

doctype html 
html 
    body 
    table(style='width:100%') 
     tr 
     th City 
     th Min 
     th Max Day 1 
     th Max Day 2 
     th Max Day 3 

     each city, i in Listings 
     tr 
     td 
     span= city.city 
     td 
     span= city.min 
     td 
     span= city.max 
     td 
     span= city.maxday2 
     td 
     span= city.maxday3 

谢谢

+0

我不明白你的意思是失去了订单。什么是你的Jade代码中的“清单”?无法在node.js代码中找到它。 – Danmoreng

+0

失去订单意味着什么?这不是很清楚。 –

+0

“列表”是Mongo系列。就像扎克布拉迪回答的顺序是任意的。你会期望看到温得和克,格拉夫里内特,皇后镇,比索。但它以随机顺序返回。 – Gvkeyser

回答

1

请务必阅读下面以及评论,因为在他们的相关信息!

对于in循环并不能保证它们将遍历索引0中的对象到某种方式。从here引述:

的了... in语句遍历一个 对象的枚举的属性,在任意秩序。

我最近遇到了类似的问题,我通过在对象中包含一串键来解决它,该对象描述了我想要遍历对象的顺序。所以当我想迭代在我刚刚使用for循环遍历数组的对象上,然后使用obj [key]访问这些键。

这有两个缺点,首先我必须编写代码来保持obj和数组同步,所以当事情被添加到对象时,我需要代码来更新数组。此外,我必须确保在循环中包含hasOwnProperty检查以确保我的数组充满了垃圾键。

它可能不是您正在寻找的解决方案,也可能是您可以在您的方案中实施的解决方案,但它对我来说确实有效。祝你好运!

[编辑]万一我并不清楚这里是一个代码示例:

var obj = { 
    Test1: 1, 
    Test3: 3, 
    Test2: 2, 
    propNames: ['Test1', 'Test2', 'Test3'] 
}; 

for(var i = 0; i < obj.propNames.length; i++) { 
    if (!obj.hasOwnProperty(obj.propNames[i])) continue; 

    console.log(obj.propNames[i] + ": " + obj[obj.propNames[i]]); 
} 

// OUTPUT 
// Test1: 1 
// Test2: 2 
// Test3: 3 
+1

另一种方法是使用正常的循环,如果你反复遍历数组。在他的情况下,他表示他也尝试过一个阵列,但我想他是这样做的... ...在循环中也是如此。从他拥有的当前数据来看,城市并不一定是一个对象,而是一个数组会变得更简单。然后你不需要额外的数组来给这些属性下一个命令。 – Danmoreng

+0

这是真的@ user2415266,但我敢肯定,Gvkeyser不是遍历数组。他开始说“我正在循环一个物体......” –

+0

我刚刚编辑了我的评论,并且这个句子基本上是您评论的答案^^ – Danmoreng

0

我发现它创建了一个新的问题,这个问题......。但我可以忍受这个新问题。一段代码,我没有发布在我原来的问题是...

var numberOfParallelRequests = 20; 
    for (var i = 0; i < numberOfParallelRequests; i++) { 
     wizard(); 
    } 

这就是问题所在。它以任何顺序同时发出20个请求。如果我把它做成1,那么它会一个一个地通过列表。新问题现在非常缓慢。