我试图通过种子使用以下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
我只想按顺序列出领导者。所以现在我们有
- Golden State
醇>
2. Memphis
3. Houston
4. Portland 3-1。洛杉矶快船队.6。达拉斯队所以 类推。
这是基于&#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
控制台输出:
答案 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.js(reference),这是一个实现.NET的LINQ for JavaScript的库。
以下展示了您可以用它做什么。长篇大论,请耐心等待。
<强>制备强>
您的NBA数据对象遵循父子关系,但它缺少一些基本的东西:
parent
个参考co
,di
,t
)为了使整个事物统一(因此可遍历),我们首先需要从中构建一个节点树。树节点将从输入图形中包装对象,如下所示:
{
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);
});
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#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文件中的数据实际意味着什么