2016-12-05 46 views
0

我正在用Javascript(Express)爲個人目的構建網站刮板。從循環中的偶數個對象創建數組

該腳本的目標是從外部來源刮取一些簡單的文本數據,最終輸出被刮取的數據爲JSON對象。 但是,因爲總會有偶數量的對象,所以我想將它們作爲成對添加到數組中,這是我需要來自你們的一些指導的部分。

輸出的電流只是一個普通的JSON對象/基於刮對象(通常在8-16)的量對象:

{ 
    name: "John Doe", 
    email: "[email protected], 
    status: "active" 
}, 

{ 
    name: "Jane Doe", 
    email: "[email protected], 
    status: "inactive" 
}, 


{ 
    name: "Johnny Walker", 
    email: "[email protected]", 
    status: "active" 
}, 

{ 
    name: "Jimmy Glenfiddich", 
    email: "[email protected] 
    status: "active" 
} 

和預期輸出會是這個樣子:

{ 

"pair-number": 1, 

"pair:" [ 

    { 
    name: "John Doe", 
    email: "[email protected], 
    status: "active" 
    }, 

    { 
    name: "Jane Doe", 
    email: "[email protected], 
    status: "inactive" 
    }, 
] 
}, 

{ 

"pair-number": 2, 

"pair:" [ 
    { 
    name: "Johnny Walker", 
    email: "[email protected]", 
    status: "active" 
    }, 

    { 
    name: "Jimmy Glenfiddich", 
    email: "[email protected] 
    status: "active" 
    } 
] 
} 

下面是使用MO我server.js

var express = require('express'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var app  = express(); 

var url = 'http://testurl.com; 
var name, email, status; 

app.get('/scrape', function(req, res) { 

    request(url, function (error, response, html) { 

     if (!error && response.statusCode == 200) { 

      var $ = cheerio.load(html); 

      data = {"name": name, "email": email, "status": status };  

      $('.scrape-class').filter(function() { 

       var that = $(this); 

       name = that.find('h5').text(); 
       email = that.find('.email').text(); 
       status = that.find('dl').children().first().text(); 

       data.name = name; 
       data.email = email; 
       data.status = status; 

       console.log(data); 
      }); 
     } 
    }); 
}); 

app.listen(80, function() { 
    console.log('Example app listening on port 80!') 
}) 

回答

0

嘗試dulo(%),得到一個除法運算的餘搞清楚,如果你的當前迭代是奇數還是偶數

這是一個基本的概念:

var arr = [1,2,3,4,5,6]; 
var results = []; 
for (var ii = 0, nn = arr.length; ii < nn; ii++) 
{ 
    if (ii % 2 == 0) //0 % 2 = 0; 1 % 2 = 1; 2 % 2 = 0; 3 % 2 = 1; 
    { 
     //Even iteration: push a new array with the current value into results array 
     results.push([arr[ii]]); 
    } 
    else 
    { 
     //Odd iteration: push current value into the last new array in results array 
     results[results.length - 1].push(arr[ii]); 
    } 
} 

//in the end, results array should look like: [[1,2],[3,4],[5,6]] 

在你的情況,你需要保持您的過濾器匿名函數外的迭代計數。

我編輯你的代碼,並增加了新的results陣列:

var express = require('express'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var app  = express(); 

var url = 'http://testurl.com; 
var name, email, status; 

app.get('/scrape', function(req, res) { 

    request(url, function (error, response, html) { 

     if (!error && response.statusCode == 200) { 

      var $ = cheerio.load(html); 

      var results = []; //store final results here 

      var data = {"name": name, "email": email, "status": status }; 

      var ii = 0; 

      $('.scrape-class').filter(function() { 

       var that = $(this); 

       name = that.find('h5').text(); 
       email = that.find('.email').text(); 
       status = that.find('dl').children().first().text(); 

       data.name = name; 
       data.email = email; 
       data.status = status; 

       console.log(data); 

       if (ii % 2 == 0) { //0 % 2 = 0; 1 % 2 = 1; 2 % 2 = 0; 3 % 2 = 1; 
        //runs on iterations: 0, 2, 4, etc 
        results.push({"pair-number": results.length + 1, "pair": [data]}); 
       } else { 
        //runs on iterations: 1, 3, 5, etc 
        results[results.length - 1]["pair"].push(data); 
       } 

       ii++; 
      }); 

      console.log(results); //print collected data after crawl 
     } 
    }); 
}); 

app.listen(80, function() { 
    console.log('Example app listening on port 80!') 
})