1

我使用 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

4 回答 4

1

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

例如:

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

这使得查找数据更容易,因为您可以遍历每条管线的 JSON“树”并找到它的数据。

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

于 2013-08-21T09:15:30.857 回答
1

仅遍历一个对象:较慢创建具有不同布局的多个对象:冗余(因此可能容易出错)

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

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

在对象的第一层查找键当然总是比迭代和搜索对象深处的值要快,但它使用更多的内存,因为附加的对象必须存储在某个地方。

于 2013-08-21T09:22:17.643 回答
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');
于 2013-08-21T14:06:35.110 回答
0

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

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

于 2013-08-21T09:05:36.407 回答