我有一个需要根据两个不同参数计算价格的屏幕,主要(示例中的活动)和子项(示例中的ticketType)
之前这是做得很糟糕,所以我决定最好的选择是将价格存储在运行时填充的JSON对象中,并基于点击次数和&改变事件
所以我制定了这种json格式,请注意你也可以改变它,而不是刻在石头上
{
"activities": [{
"activitycode": "TK",
"desc": "Tickets",
"ticketTypes": [{
"ticketcode": "G",
"baseprice": 79
}, {
"ticketcode": "P",
"baseprice": 109
}]
}, {
"activitycode": "PK",
"desc": "Parking",
"ticketTypes": [{
"ticketcode": "BK",
"baseprice": 65
}, {
"ticketcode": "ESC-I",
"baseprice": 40
}]
}], //end activities
"handlingPercent": "0.03",
"shipping": "15"
}
所以,我尝试以正确的价格遍历JSON对象,就像这样
pricing.activities.activitycode['TK'].ticketTypes.ticketcode['G'].baseprice
但这不起作用,因为在提供我的值之前我还没有指定要去哪个数字节点
一旦我这样做,以下工作
pricing.activities[0].ticketTypes[0].baseprice
但我想要完成的是提供字符串/文本值,遍历父节点,然后是子节点,并找到值
我想我可以像这样进行$ .each迭代,但我想知道专家们首先想到的是什么,如果这确实是最好的解决方法
$.each(pricing.activities, function(arrayID, activityData) {
if(activityData.activitycode=="TK")
$.each(activityData.ticketTypes, function(ticketTypeID, typeData) {
if(typeData.ticketcode=="G")
alert(typeData.baseprice);
});
});
答案 0 :(得分:2)
您是否尝试过$.grep()
?
var test = $.grep(pricing.activities, function(e){ return e.activitycode == 'TK'; });
var test2 = $.grep(test[0].ticketTypes, function(e){ return e.ticketcode == "G";});
console.log(test2[0].baseprice);
上的jQuery API文档
的示例
我不会说它比$.each()
更好,但如果你遇到那种事情,这是另一种方法。
答案 1 :(得分:2)
在谈论代码之前,让我们谈谈你的JSON数据。
首先,我重新格式化了数据,以便更容易地遵循结构:
{
"activities": [
{
"activitycode": "TK",
"desc": "Tickets",
"ticketTypes": [
{ "ticketcode": "G", "baseprice": 79 },
{ "ticketcode": "P", "baseprice": 109 }
]
},
{
"activitycode": "PK",
"desc": "Parking",
"ticketTypes": [
{ "ticketcode": "BK", "baseprice": 65 },
{ "ticketcode": "ESC-I", "baseprice": 40 }
]
}
],
"handlingPercent": "0.03",
"shipping": "15"
}
既然结构清晰,那么问题是:你有一个activities
数组,并且在该数组的每个元素中都有一个ticketTypes
数组。
这些数组中的项目顺序是否重要?即它们是否用于生成必须按正确顺序显示的列表?
而且,您如何访问这些阵列?你主要是通过它们循环并对所有元素做些什么吗?或者你使用它们来查找给定已知activitycode
和ticketcode
的单个元素 - 这就是你问题末尾的嵌套$.each
循环结束了吗?
根据这些问题的答案,您可能会更好地使用不同类型的结构。也许是这样的:
{
"activities": {
"TK": {
"desc": "Tickets",
"ticketTypes": {
"G": { "baseprice": 79 },
"P": { "baseprice": 109 }
}
},
"PK": {
"desc": "Parking",
"ticketTypes": {
"BK": { "baseprice": 65 },
"ESC-I": { "baseprice": 40 }
}
}
},
"handlingPercent": "0.03",
"shipping": "15"
}
因为现在这段代码(我也在这里清理了缩进):
$.each( pricing.activities, function( arrayID, activityData ) {
if( activityData.activitycode=="TK" ) {
$.each( activityData.ticketTypes, function( ticketTypeID, typeData ) {
if( typeData.ticketcode=="G" )
alert( typeData.baseprice );
});
}
});
可以替换为:
alert( pricing.activities.TK.ticketTypes.G.baseprice );
和你编写的其他类似代码也会更简单。关于你唯一丢失的方法是保证activities
和ticketTypes
的排序:数组有保证顺序,对象没有。