首页 > 解决方案 > 如何使用迭代器和生成器来执行以下操作?

问题描述

我想获取​data.json​文件,解析成一个对象,并使其成为可迭代对象。(不要将对象数据类型更改为数组)使其成为可迭代使用

  1. 迭代器 2. 生成器 当该对象在 FOR OF 循环中传递时,我应该得到每个项目的输出,如下所示。Post Id: 1 Title: Some title Post Id: 2 Title: Some other title 等等……这是json文件的链接[https://raw.githubusercontent.com/attainu/curriculum-master-fullstack/master/编码挑战/深潜/迭代器-data.json?token=AOGF265VMPYWFKXO6RNGXPS67WAMM][1]

console.log("connected");
function fetchJSONFile(path, callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                var data = JSON.parse(httpRequest.responseText);
                if (callback) callback(data);
            }
        }
    };
    httpRequest.open('GET', path);
    httpRequest.send(); 
}
fetchJSONFile(`https://raw.githubusercontent.com/attainu/curriculum-master-fullstack/master/coding-challenges/deep-dive/iterators-data.json?token=AOGF265VMPYWFKXO6RNGXPS67WAMM`, function(data)
{   
data[Symbol.iterator] = function() 
{
    var c=0;
  return {
      // I Don't know how to access the key of the object inside the object , Can you help me please?? 
    next() {
        c++;
      if (c <= data.length) {
        return { done: false, value: "value" };
      } else {
        return { done: true };
      }
    }
  }};
for (let val of data) {
  console.log(val); 
}
});

标签: javascriptjsonobjectiteratorgenerator

解决方案


我已经用 fetch 试过了。您可以进行更改。没挖。想出了这个。您将必须定义自己的iterator. 这是你想要的吗?

const fetch = require('node-fetch');

const arr = [];
let status;
fetch('https://raw.githubusercontent.com/attainu/curriculum-master-fullstack/master/coding-challenges/deep-dive/iterators-data.json?token=AOGF265VMPYWFKXO6RNGXPS67WAMM') // Call the fetch function passing the url of the API as a parameter
  .then((res) => {
    status = res.status;
    return res.json()
  })
  .then((jsonData) => {
    jsonData[Symbol.iterator] = function () {
      var self = this;
      var values = Object.keys(this);
      var i = 0;
      return {
        next: function () {
          return {
            value: self[values[i++]],
            done: i > values.length
          }
        }
      }
    }
   //you we can iterate over object
    for (var p of jsonData) {
      const obj = {
        "PostID": p.id,
        "Title": p.title
      }
      arr.push(obj)
    }
    console.log(arr)
  })
  .catch((err) => {
    // handle error for example
    console.error(err);
  });

推荐阅读