簡體   English   中英

使用jquery基於值的JSON迭代

[英]JSON iteration based on value using jquery

我正試圖通過種子使用以下json文件創建一個簡單的NBA西部領導者展示:

http://data.nba.com/data/v2014/json/mobile_teams/nba/2014/00_standings.json

現在我有以下內容:

$(document).ready(function() {

$.getJSON('http://data.nba.com/data/v2014/json/mobile_teams/nba/2014/00_standings.json',function(info){

    var eastHead = info.sta.co[0].val;
    var divi = info.sta.co[0].di[0].val;

    /*evaluate East*/
    for(i=0;i < divi.length;i++){

        var visTeam ='<li>' + divi + '</li>';
         document.getElementById("eastHead").innerHTML=eastHead;
    }
    var seed = info.sta.co[0].di[0].t[0].see;


                    $.each(menuItems.data, function (i) {
                        var eastSeed ='<li>' + seed + '</li>';
                        console.log(eastSeed)
                        document.getElementById("eastSeed").innerHTML=eastSeed;
                    });//$.each(menuItems.data, function (i) {

});//getJSON

});//ready

我只是想按順序列出領導者。 所以現在我們有

  1. 金州
    孟菲斯
    3.休斯頓
    波特蘭
    5.洛杉磯快船隊
    達拉斯
    ......等等。

這是基於“看”值,這意味着西方的種子。

這個問題是我得到的是單個值而不是迭代。

更新:

$(document).ready(function() {

$.getJSON('http://data.nba.com/data/v2014/json/mobile_teams/nba/2014/00_standings.json',function(info){



                    /**************************************************/
                        //Get info above here
                        var westDivision = info.sta.co[1].di;
                        westDivision.forEach(function (subdivision)
                        {
                            subdivision.t.forEach(function (team)
                            {
                                westTeams.push({
                                    city: team.tc,
                                    name: team.tn,
                                    seed: team.see
                                });
                            });
                        });
                        function compare(a,b) {
                          if (a.see < b.see)
                             return -1;
                          if (a.see > b.see)
                            return 1;
                          return 0;
                        }
                        var sorted = westTeams.sort(compare);
                        sorted.forEach(function (el,i)
                        {
                            console.log(i+'. '+el.city+' '+el.name);
                        });
                        /**************************************************/    

});//getJSON

});//ready

控制台輸出:

  1. 波特蘭開拓者隊
  2. 俄克拉荷馬雷霆隊
  3. 丹佛掘金隊
  4. 猶他爵士隊
  5. 明尼蘇達森林狼隊
  6. 金州勇士隊
  7. 洛杉磯快船隊
  8. 菲尼克斯太陽隊
  9. 薩克拉門托國王隊
  10. 洛杉磯湖人隊
  11. 孟菲斯灰熊隊
  12. 休斯頓火箭隊
  13. 達拉斯小牛隊
  14. 聖安東尼奧馬刺隊
  15. 新奧爾良鵜鶘

我喜歡用forEach迭代。 而不必擔心索引,您可以直接引用數組的每個項目。

使用此代碼,您可以將所需的數據放入數組中。

//Get info above here
var westTeams = [];
var westDivision = info.sta.co[1].di;

westDivision.forEach(function (subdivision)
{
    subdivision.t.forEach(function (team)
    {
        westTeams.push({
            city: team.tc,
            name: team.tn,
            seed: team.see
        });
    });
});

然后你可以使用obj.sort對它們進行obj.sort

function compare(a,b) {
  if (a.seed < b.seed)
     return -1;
  if (a.seed > b.seed)
    return 1;
  return 0;
}
var sorted = westTeams.sort(compare);

最后,您可以按順序打印它們。

sorted.forEach(function (el,i)
{
    console.log((i+1)+'. '+el.city+' '+el.name);
});

查詢大型JavaScript對象圖形可能是一件單調乏味的事情,特別是如果您想要動態輸出。 實現對不同過濾條件的支持,排序順序,“前N個”限制,分頁可能很困難。 無論你提出什么,往往都是不靈活的。

為了涵蓋這些情況,您可以(如果您不介意學習曲線)使用linq.js參考 ),這是一個實現.NET的LINQ for JavaScript的庫。

以下展示了您可以用它做什么。 長篇大論,請耐心等待。

制備

您的NBA數據對象遵循父子層次結構,但它缺少一些基本的東西:

  • 沒有parent參考
  • 包含子項的屬性在每個級別上調用不同(即codit

為了使整個事物統一(因此可遍歷),我們首先需要從中構建一個節點樹。 樹節點將從輸入圖形中包裝對象,如下所示:

{
    obj: o,       /* the original object, e.g. sta.co[1]               */
    parent: p,    /* the parent tree node, e.g. the one that wraps sta */
    children: []  /* array of tree nodes built from e.g. sta.co[1].di  */
}

這個結構的構建可以在一個函數中遞歸完成:

function toNode(obj) {
    var node = {
            obj: obj,
            parent: this === window ? null : this,
            // we're interested in certain child arrays, either of:
            children: obj.co || obj.di || obj.t || []
        };

    // recursive step (with reference to the parent node)
    node.children = node.children.map(toNode, node);

    // (*) explanation below
    node.parents = Enumerable.Return(node.parent)
        .CascadeDepthFirst("$ ? [$.parent] : []").TakeExceptLast(1);

    return node;
}

(*) node.parents屬性是一個便利設施。 它包含除最后一個節點之外的所有父節點的枚舉(即根節點,它為null )。 此枚舉可用於過濾,如下所示。

該函數的結果是一個漂亮且統一的相互鏈接的節點樹。 (擴展代碼片段,但不幸的是,由於源頭瀏覽器的限制,它目前無法運行。也許NBA REST API中有一些東西需要先打開。)

 function toNode(obj) { var node = { obj: obj, parent: this === window ? null : this, children: obj.co || obj.di || obj.t || [] }; node.children = node.children.map(toNode, node); node.parents = Enumerable.Return(node.parent) .CascadeDepthFirst("$ ? [$.parent] : []").TakeExceptLast(1); return node; } $(function () { var standingsUrl = 'http://data.nba.com/data/v2014/json/mobile_teams/nba/2014/00_standings.json'; $.getJSON(standingsUrl, function(result) { var sta = toNode(result.sta); console.log(sta); }); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

結果

現在我們有了一個完全可遍歷的節點樹,我們可以使用LINQ查詢來完成復雜的事情,只需幾行代碼:

// first build our enumerable stats tree
var stats = Enumerable.Return(toNode(result.sta));

// then traverse into children; the ones with a tid are teams
var teams = stats.CascadeDepthFirst("$.children")
    .Where("$.obj.tid");

好的,我們確定了所有團隊,所以我們可以......

// ...select all that have a parent with val 'West' and order them by 'see'
var westernTeams = teams.Where(function (node) {
        return node.parents.Any("$.obj.val === 'West'");
    })
    .OrderByDescending("$.obj.see");

// ...insert the top 5 into our page as list items
westernTeams.Take(5).Do(function (node) {
    $("<li></li>", {text: node.obj.tc + ' ' + node.obj.tn}).appendTo("#topFiveList");
});

// ...turn them as an array of names
var names = westernTeams.Select("$.obj.tc + ' ' + $.obj.tn").ToArray();
console.log(names);

當然,我在幾個步驟中完成的工作可以在一個步驟中完成:

// request details for all Northwest and Southeast teams who have won more than one game (*)
var httpRequests = Enumerable.Return(toNode(result.sta))
    .CascadeDepthFirst("$.children")
    .Where("$.obj.tid")
    .Where(function (node) {
        var str = node.obj.str.split(" ");
        return str[0] === "W" && str[1] > 1 && 
            node.parents.Any("$.obj.val==='Northwest' || $.obj.val==='Southeast'");
    })
    .Select(function (node) {
        return $.getJSON(detailsUrl, {tid: node.obj.tid});
    })
    .ToArray();

$.when.apply($, httpRequests).done(function () {
    var results = [].slice.call(arguments);
    // all detail requests have been fetched, do sth. with the results
});

(*)糾正我,如果我錯了,我不知道JSON文件中的數據實際意味着什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM