从 JSON 对象的内部深度获取信息

getting information from the inner depths of a JSON object

本文关键字:深度 获取 信息 内部 JSON 对象      更新时间:2023-09-26

我有一个来自CrunchBase API的JSON对象,给了我一堆来自给定公司的信息。现在我正在尝试浏览 JSON 对象并创建他们的投资者列表。投资者可以分为三类,"company", "financial_org", or "person"。所有三种类型都将附加到同一列表中,finalInvestorList

该脚本运行没有错误,但仅生成第一轮上市的投资者列表。我已经记录了我认为可能有帮助的所有内容。日志位于同一行注释中。

基本上我的问题是它只循环一次,因此只添加了第一轮的投资者。任何帮助将不胜感激。如果您需要更多信息,请告诉我!

  var investorList = function(data, num) {
        var fundingRounds = data["funding_rounds"];
        var finalInvestorList = []
        console.log(fundingRounds.length) // 3

        for (i=0; i < fundingRounds.length; i++) {
            var investments = data["funding_rounds"][i]["investments"];
            console.log(data["funding_rounds"][1]["investments"]); //correctly logs the index 1 round for spling (2nd round)
            var round = data["funding_rounds"][i];
            console.log('round' + i); //only logs round0, never loops around for round1, round2
            for (i=0; i < investments.length; i++) {
                var angelObject = round["investments"][i]["person"];
                if (angelObject != null) {
                    console.log("angel fired"); //fires for "Mitch Blumenfeld"
                    var angel = angelObject["first_name"] + " " + angelObject["last_name"];
                    finalInvestorList[i] = angel;
                }
                var financialOrgObject = round["investments"][i]["financial_org"];
                if (financialOrgObject != null) {
                    console.log("financial_org fired"); //fires for "Bucknell Venture Plan Competition"
                    console.log(financialOrgObject['name']); //Bucknell VPC
                    var financialOrg = financialOrgObject["name"]
                    finalInvestorList[i] = financialOrg
                }
                var companyObject = round['investments'][i]["company"];
                if (companyObject != null) {
                    console.log('company fired'); //i haven't bothered with this yet.. just logging it so ill know if its firing
                }
            }
        }
        console.log(finalInvestorList); //["Bucknell Venture Plan Competition", "Mitch Blumenfeld"]
    }

数据表示的JSON对象如下我只用需要的一点缩短了它。JSON 响应数据中的对象由 data["funding_rounds"] 表示此数据是使用 Crunch API 检索的,可以在 http://api.crunchbase.com/v/1/company/spling.js 中找到完整形式

"funding_rounds":
  [{"round_code": "seed",
    "source_url": "",
    "source_description": "",
    "raised_amount": 50000.0,
    "raised_currency_code": "USD",
    "funded_year": 2011,
    "funded_month": 2,
    "funded_day": 1,
    "investments":
     [{"company": null,
       "financial_org":
        {"name": "Bucknell Venture Plan Competition",
         "permalink": "bucknell-venture-plan-competition",
         "image": null},
       "person": null},
      {"company": null,
       "financial_org": null,
       "person":
        {"first_name": "Mitch",
         "last_name": "Blumenfeld",
         "permalink": "mitch-blumenfeld",
         "image": null}}]},
   {"round_code": "seed",
    "source_url": "http://techcrunch.com/2011/09/08/dreamit-ventures-launches-its-fall-2011-philadelphia-class/",
    "source_description": "",
    "raised_amount": 25000.0,
    "raised_currency_code": "USD",
    "funded_year": 2011,
    "funded_month": 9,
    "funded_day": 1,
    "investments":
     [{"company": null,
       "financial_org":
        {"name": "DreamIt Ventures",
         "permalink": "dreamit-ventures",
         "image":
          {"available_sizes":
            [[[150,
               57],
              "assets/images/resized/0002/7773/27773v5-max-150x150.jpg"],
             [[250,
               96],
              "assets/images/resized/0002/7773/27773v5-max-250x250.jpg"],
             [[251,
               97],
              "assets/images/resized/0002/7773/27773v5-max-450x450.jpg"]],
           "attribution": null}},
       "person": null}]},
   {"round_code": "a",
    "source_url": "http://techcrunch.com/2011/12/05/new-content-sharing-network-spling-launches-announces-400k-series-a/",
    "source_description": "New Content Sharing Network Spling Launches, Announces $400K Series A",
    "raised_amount": 400000.0,
    "raised_currency_code": "USD",
    "funded_year": 2011,
    "funded_month": 12,
    "funded_day": 5,
    "investments":
     [{"company": null,
       "financial_org":
        {"name": "Deep Fork Capital",
         "permalink": "deep-fork-capital-2",
         "image":
          {"available_sizes":
            [[[150,
               20],
              "assets/images/resized/0008/0167/80167v1-max-150x150.png"],
             [[250,
               34],
              "assets/images/resized/0008/0167/80167v1-max-250x250.png"],
             [[450,
               62],
              "assets/images/resized/0008/0167/80167v1-max-450x450.png"]],
           "attribution": null}},
       "person": null},
      {"company": null,
       "financial_org": null,
       "person":
        {"first_name": "John",
         "last_name": "Ason",
         "permalink": "john-ason",
         "image": null}},
      {"company": null,
       "financial_org": null,
       "person":
        {"first_name": "Mitchell",
         "last_name": "Blumenfeld",
         "permalink": "mitchell-blumenfeld",
         "image": null}},
      {"company": null,
       "financial_org": null,
       "person":
        {"first_name": "Gianni",
         "last_name": "Martire",
         "permalink": "gianni-martire",
         "image":
          {"available_sizes":
            [[[138,
               150],
              "assets/images/resized/0006/3720/63720v4-max-150x150.jpg"],
             [[230,
               250],
              "assets/images/resized/0006/3720/63720v4-max-250x250.jpg"],
             [[414,
               450],
              "assets/images/resized/0006/3720/63720v4-max-450x450.jpg"]],
           "attribution": ""}}}]}]

感谢您的帮助!

您在每个循环中对计数器使用相同的变量名称,因此当内部循环完成并且外部循环到达其第二次迭代时,iinvestments.length,而不是1。 为每个循环使用不同的变量名称:

for (var roundIdx = 0; roundIdx < fundingRounds.length; roundIdx++) {
    ...
    for (var invIdx = 0; invIdx < investments.length; invIdx++) {
        ...

另外,不要使用array[i] = value表示法填充数组,只需使用 array.push(value) . 无需跟踪索引。

但是,我建议使用 Array.forEach() 并使用点语法而不是方括号表示法来迭代您的数组:

function investorList(data, num) {
    var finalInvestorList = [];
    data.funding_rounds.forEach(function (round, i) {
        round.investments.forEach(function (investment, i) {
            if (investment.person) {
                finalInvestorList.push(investment.person.first_name + " " +
                                       investment.person.last_name);
            }
            else if (investment.financial_org) {
                finalInvestorList.push(investment.financial_org.name)
            }
            else if (investment.company) {
                finalInvestorList.push(investment.company.name)
            }
        }
    }
}

对于本机不支持Array.forEach()的旧浏览器,请使用此处的实现来填充浏览器。