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

时间:2012-05-09 22:08:08

标签: javascript json object loops for-loop

我有一个来自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响应数据中的对象由数据[“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": ""}}}]}]

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

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) } } } } 的旧版浏览器,请使用the implementation here来填充浏览器。