[英]Selecting a value in a JSON object based on another JSON value using Jquery
[英]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
我只是想按順序列出領導者。 所以現在我們有
- 金州
孟菲斯
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
控制台輸出:
我喜歡用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
參考 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); }); });
<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.