亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當一個不存在時組合 2 個 JSON 對象

當一個不存在時組合 2 個 JSON 對象

慕姐4208626 2023-03-24 14:13:53
function fetchAPI(string) {    return fetch(string).then(function(response) {        return response.json();    }).then(function(json) {        return json;    });}try {   fetchAPI(`https://api.hypixel.net/skyblock/auctions?key=${apikey}`).then(       function(result1) {          delete result1.success;          delete result1.page;          delete result1.totalAuctions;          delete result1.lastUpdated;          var pages = result1.totalPages;          delete result1.totalPages;          // eslint-disable-next-line no-shadow          for (var page = 0; page < pages; page++) {             fetchAPI(`https://api.hypixel.net/skyblock/auctions?key=${apikey}&page=${page}`).then(function(results) {                  delete results.success;                  delete results.page;                  delete results.totalAuctions;                  delete results.lastUpdated;                  delete results.totalPages;                  var i = 0;                  for (i = 0; i < results.auctions.length; i++) {                      // eslint-disable-next-line quotes                      if (results.auctions[i].item_name != "Enchanted Book") {                        delete results.auctions[i];                      }                  }                  fs.appendFile('finalresult.json', JSON.stringify(results), err => {                    if (err) console.log(err);                  });                                   });          }       },   });} catch (error) {    console.log(error);}在代碼中,我從返回 JSON 響應的 API(fetchAPI 函數)獲取信息。要從 API 獲取所有信息,我需要查詢特定端點的每個頁面,因此循環for (var page = 0; page < pages; page++)。然后,我需要過濾 JSON:for (i = 0; i < results.auctions.length; i++) {    // eslint-disable-next-line quotes    if (results.auctions[i].item_name != "Enchanted Book") {       delete results.auctions[i];    }}最后,我需要將每一頁的所有 JSON 信息都保存到一個文件中。唯一的問題是,將來我需要從該文件中讀取,而當我讀取時fs.appendFile('finalresult.json', JSON.stringify(results));,它不會保留 JSON 格式。有沒有一種方法可以基本上制作一個由 API 數據組成的長 JSON 文件?
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

對不起。我今天很累,忘記了代碼的異步特性。


這是完全有效的示例(即使沒有 apiKey)。你可以運行它:


//const originalUrl = `https://api.hypixel.net/skyblock/auctions?key=${apikey}`;

const originalUrl = `https://api.hypixel.net/skyblock/auctions?rnd=1`;

const nameToSearch = 'Enchanted Book';


function showLoaded(count, total) {

  const el = document.getElementById('loader');

  if (count) el.innerText = '' + count + ' of ' + total;

  else el.innerText = 'ALL';

}


function fetchAPI(string) {

  return fetch(string)

   .then(response => response.json());

}


function getAuctionsFromPage(page, totalPages) {

  return fetchAPI(originalUrl + `&page=${page}`)

    .then(result => {

      loaded++;

      showLoaded(loaded, totalPages);

      return result.auctions

    })

    .then(auctions => auctions.filter(auction => auction.item_name == nameToSearch));

}


let loaded = 0;


function collectData(totalPages) {

  const allPages = [];

  loaded = 0;

  for (let i = 0; i < totalPages; i++) {

    allPages.push(getAuctionsFromPage(i, totalPages));

  }

  return Promise.all(allPages)

    .then(auctions => auctions.flat(1))

    .then(auctions => {

      showLoaded();

      return {

        auctions

      }

    });

}


function saveToFile(data) {

  // Put data to file

  fs.appendFile('finalresult.json', JSON.stringify(data), err => {

    if (err) console.log(err);

  });

}


function saveToConsole(data) {

  const jsonData = JSON.stringify(data);

  //console.log(jsonData);

  document.getElementById('console').innerHTML = 'We found ' + data.auctions.length + ' items named ' + nameToSearch + '<br/>Data size is ' + jsonData.length + ' bytes';

}


try {

  document.getElementById('loader').innerText = 'Getting total pages...';

  fetchAPI(originalUrl)

    .then(result => result.totalPages)

    .then(totalPages => collectData(totalPages))

    .then(data => saveToConsole(data));

} catch (error) {

  console.log(error);

}

<div>Loaded: <span id="loader">0</span></div>

<div id="console"></div>

注意:要將數據保存到文件中,您需要更改.then(data => saveToConsole(data)).then(data => saveToFile(data))



查看完整回答
反對 回復 2023-03-24
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號