我有一个屏幕,需要根据两个不同的参数计算价格,主要参数(示例中的事件)和子参数(示例中的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);
});
});
最佳答案
在讨论代码之前,让我们先讨论一下 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
排序的保证:数组有保证的顺序,而对象没有。
关于javascript - 使用多个字符串值查找 JSON 嵌套节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16970265/