搜索不同属性时正确布局Json数据

时间:2013-08-21 08:57:44

标签: javascript json

我使用JSON创建了一个数据文件。数据是关于地铁站的变量选择。请参阅下面的文件部分。 当您拥有电台ID时,此设置非常适合查找电台。 例如:当您点击我网页上的电台时,元素ID就是电台代码,这样就可以用一个弹出框填充电台名称和区域。

但是,例如,如果给出全文名称,最好找到电台的位置? a)我必须有一个迭代遍历每个站对象的代码,并使用if命令检查对象中的名称与给定的名称。 b)在第二个javascript对象中创建一组键:值对,首先用于查找工作站ID,然后在第一个对象中搜索其余的工作站数据。

另外,我如何在给定线路上的所有电台上找到数据。 a)迭代并检查每个tubelines数组包含行字符串 b)另一个包含行标题下所有站点代码的对象。

{
    "BST": {
        "name": "Baker Street",
        "Location": [
            51.523129639184,
            -0.15688978273689
        ],
        "zone": 1,
        "tubelines": [
            "Bakerloo",
            "Circle",
            "Hammersmith & City",
            "District"
        ],
        "Bakerloo": {
            "stepfreetrain": false
        },
        "Circle": {
            "stepfreetrain": false
        },
        "Hammersmith & City": {
            "stepfreetrain": false
        },
        "District": {
            "stepfreetrain": false
        }
    },
    "CHX": {
        "name": "Charing Cross",
        "Location": [
            51.508358644804,
            -0.12478853109718
        ],
        "zone": 1,
        "tubelines": [
            "Bakerloo",
            "Northern"
        ],
        "Bakerloo": {
            "stepfreetrain": true
        },
        "Northern": {
            "stepfreetrain": true
        }
    }
}

所以关键问题是,这是上面列出数据的最佳方法,如果是这样,哪种方法可以提取信息?

4 个答案:

答案 0 :(得分:1)

我建议将所有单独的管线数据放在“tubelines”属性中。

例如:

{
    "tubelines": {
        "Bakerloo": {
            "stepfreetrain": true
        },
        "Northern": {
            "stepfreetrain": true
        }
    }
}

这样可以更轻松地查找数据,因为您可以遍历每个管线的JSON“树”并找到它的数据。

另外,我发现将坐标“lat”和“long”命名为“Location”(Location.lat,Location.long)与使用数组(Location [0],Location [1])的单独属性更容易)为了便于阅读并消除输入数据时出错的可能性。

答案 1 :(得分:1)

迭代一个唯一的对象:更慢 创建具有不同布局的多个对象:冗余(因此可能容易出错)

如果读取数据的速度比高(呃)内存消耗更重要,则编写一个函数来自动生成在运行时为您的需求设计的多个对象,ONCE。不要手动执行此操作,因为它容易出错并且是一项猴子任务。并且不要忘记观察主对象的更改(如果它可以在运行时修改),这样您就可以在条目被修改后立即重新生成优化对象。在启动应用程序时,这会花费一些性能,但您可以快速轻松地从生成的对象中读取。

如果低内存消耗比查找条目的速度更重要(例如,因为您的应用程序在具有低内存的旧设备上运行)只需遍历条目。我不是100%确定每次查找一次迭代使用的内存少于创建多个不同对象并将其保留在内存中 - 这可能取决于数据对象的大小。

在对象的第一级查找键当然总是比迭代和搜索对象深处的值更快,但它使用更多的内存,因为其他对象必须存储在某处。

答案 2 :(得分:1)

回答你的问题(发表评论的时间太长了):

在"初始化"中创建这些辅助对象。相。生成对象后,您可以通过简单的" API"来访问它们。做了一个小例子(使用jQuery并假设你的斑点存储在spots.json文件中):

var myApp = {

    init: function() {

        // show loading screen while fetching data and creating the "lookup" objects
        showLoader();

        var loadSpots = $.ajax({
            url: "/spots.json"
        });

        loadSpots.done(function(spots) {

            myApp.spots = spots;

            $.each(spots, function(code, details) {
                nameLookup[details.name] = spots[code];
            });

            // All done, hide the loading screen
            hideLoader();

        });

    },

    spots: {},
    nameLookup: {},

    findByCode: function(code) {
        return myApp.spots[code]; 
    },

    findByName: function(name) {
        return myApp.nameLookup[name]; 
    }

};

myApp.init();

// you can then use these API methods to find all information for Baker Street either by name or by code (or by whatever)
myApp.findByCode('BST');
myApp.findByName('Baker Street');

答案 3 :(得分:0)

我怀疑,考虑到地铁站的数量(270?),你不会注意到任何特定的数据安排都是优越的。几乎在任何平台上都不会发现简单的迭代。

我宁愿(一如既往)专注于使代码清晰易懂,易于管理/维护,并担心特定的性能问题。