2

我有一个屏幕需要根据两个不同的参数计算价格,主要(例如活动)和子(例如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);
     });
});
4

2 回答 2

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 文档在$.grep() 这里

这个问题的例子

我不会说它比 更好$.each(),但它是另一种方法,如果你喜欢那种事情。

于 2013-06-06T20:23:43.393 回答
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 );

以及您编写的其他类似代码也会更简单。以这种方式失去的唯一一件事是保证activitiesand ticketTypes: 数组的顺序有保证,而对象则没有。

于 2013-06-06T20:25:58.603 回答