使用jquery基于值的JSON迭代

时间:2015-02-22 19:34:24

标签: javascript jquery json

我试图通过种子使用以下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. Golden State
    2. Memphis
    3. Houston
    4. Portland 3-1。洛杉矶快船队.6。达拉斯队所以   类推。
  2.   

这是基于&#34;见&#34;这意味着西方的种子。

这个问题是我得到的是单个值而不是迭代。

更新:

$(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. 新奥尔良鹈鹕

2 个答案:

答案 0 :(得分:2)

我喜欢用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

对它们进行排序
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);
});

答案 1 :(得分:1)

查询大型JavaScript对象图形可能是一件单调乏味的事情,特别是如果您想要动态输出。实施对不同过滤条件的支持,排序顺序,&#34; top N&#34;限制,分页可能很困难。无论你提出什么,往往都是不灵活的。

为了涵盖这些情况,您可以(如果您不介意学习曲线)使用linq.jsreference),这是一个实现.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中有一些东西需要先打开。)

&#13;
&#13;
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);
    });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

<强>结果

现在我们有一个完全可遍历的节点树,我们可以使用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文件中的数据实际意味着什么