Как мне объединить отдельные объекты json, выводимые из цикла for, в массив? - PullRequest
0 голосов
/ 21 мая 2019

Я очищаю веб-сайты, используя CasperJS, и одна из задач заключается в сканировании URL-адреса, заданного счетчиком цикла for.URL выглядит следующим образом:

www.example.com/page/no=

, где no - это любое число от 0 до 10, установленное счетчиком цикла for.Затем скребок просматривает все страницы, собирает данные в объект JSON и повторяется до тех пор, пока не будет = 10.

Данные, которые я пытаюсь получить, хранятся в отдельных группах на каждой странице - я хотел бы работать с одним объектом JSON, объединяя все извлеченные выходные данные каждой страницы.

Представьте, что у Page1 есть Расход 1, и объект, который я получаю, - {расход1}, а у Страницы 2 - Расход 2, а объект, который я получаю, - {расход2}.То, что я хотел бы иметь, это один JSON в конце очистки, который выглядит следующим образом:

    scrapedData = {
       "expense1": expense1,
       "expense2": expense2,
     }

У меня возникают проблемы при объединении всех объектов JSON в один массив.

Я инициализировал пустой массив, а затем каждый объект помещался в массив.Я попытался проверить, где, если итератор i в for цикл равен 10, то объект JSON распечатывается, но это, похоже, не работает.Я посмотрел вверх, и кажется, что распространение объекта это вариант, но я не уверен, как использовать его в этом случае.

Любые указатели будут полезны.Должен ли я использовать какие-либо функции массива, такие как map?

casper.then(function(){    

   var url = "https:example.net/secure/SaFinShow?url=";    
    //We create a for loop to go open the urls

    for (i=0; i<11; i++){

      this.thenOpen(url+ i, function(response){

          expense_amount = this.fetchText("td[headers='amount']");

          Date = this.fetchText("td[headers='Date']");

          Location = this.fetchText("td[headers='zipcode']");

          id = this.fetchText("td[headers='id']");


          singleExpense = {

              "Expense_Amount": expense_amount,
              "Date": Date,
              "Location": Location,
              "id": id
            };

          if (i ===10){
            expenseArray.push(JSON.stringify(singleExpense, null, 2))
            this.echo(expenseArray);
          }
      });

    };
});

1 Ответ

0 голосов
/ 21 мая 2019

Взяв ваш пример и расширив его, вы сможете сделать что-то вроде:

// Initialize empty object to hold all of the expenses
var scrapedData = {};

casper.then(function(){    

   var url = "https:example.net/secure/SaFinShow?url=";    
    //We create a for loop to go open the urls

    for (i=0; i<11; i++){

      this.thenOpen(url+ i, function(response){

          expense_amount = this.fetchText("td[headers='amount']");

          Date = this.fetchText("td[headers='Date']");

          Location = this.fetchText("td[headers='zipcode']");

          id = this.fetchText("td[headers='id']");


          singleExpense = {

              "Expense_Amount": expense_amount,
              "Date": Date,
              "Location": Location,
              "id": id
            };
          // As we loop over each of the expenses add them to the object containing all of them
          scrapedData['expense'+i] = singleExpense;
      });

    };
});

После этого переменная scrapedData должна иметь вид:

scrapedData = {
  "expense1": expense1,
  "expense2": expense2
}

Обновленный код

Одна из проблем с приведенным выше кодом заключается в том, что внутри цикла for, когда вы перебираете расходы, переменные должны быть локальными.Имена переменных также не должны быть Date и Location, поскольку это встроенные имена в JavaScript.

// Initialize empty object to hold all of the expenses
var scrapedData = {};

casper.then(function(){    

   var url = "https:example.net/secure/SaFinShow?url=";    
    //We create a for loop to go open the urls

    for (i=0; i<11; i++){

      this.thenOpen(url+ i, function(response){
          // Create our local variables to store data for this particular
          // expense data
          var expense_amount = this.fetchText("td[headers='amount']");

          // Don't use `Date` it is a JS built-in name
          var date = this.fetchText("td[headers='Date']");
          // Don't use `Location` it is a JS built-in name
          var location = this.fetchText("td[headers='zipcode']");

          var id = this.fetchText("td[headers='id']");


          singleExpense = {

              "Expense_Amount": expense_amount,
              "Date": date,
              "Location": location,
              "id": id
            };

          // As we loop over each of the expenses add them to the object containing all of them
          scrapedData['expense'+i] = singleExpense;
      });

    };
});
...