javascript - Javascript 中的 JSONPath 太长了——比经典循环长大约 3000 倍

标签 javascript json performance jsonpath

在 Javascript 中运行 JSONPath 时遇到性能问题(Stephan Goessner Usefull Library)

具有以下 JSON 结构。

[
    {
    id:1, 
    name: "lorem", 
    elements: 
    [
        {
            id:101,
            date: Fri Jan 31 2014 18:03:41 GMT+0100 (Paris, Madrid),  // Javascript Date Object,
            instances: [ 
                {
                    id: 1001, 
                    properties: [
                        {
                            code: 'ipsum lens', 
                            id: 1001, 
                            values: [
                                "value1", 
                                "value2",
                                ...
                                // less than 5 values
                            ]
                        }, 
                        ... , / between 20 to 40 items
                    ]
                },
                ... // About 100 items
            ]
        },
        ... // Less than 5 items
    ], 
    meta: [
        {
            id: 10000, 
            code: 'codeabc', 
            property1: true, 
            property2: false,
            property3: 2939, 
        }, 
        ... // between 20 to 40 items
    ]
    }, 
    ... // 4 items
]

这里是数量:

  • level1 包含 4 个项目
  • level2 'elements' 在每个级别上包含 2 个项目
  • level3 'instances' 包含关于我的特定元素的大约 100 个项目(其他完全相同)
  • level4 'properties' 包含大约 15 个项目

使用 JSON 路径,下面的代码让我在 chrome 中响应时间接近 4 秒

var startDate = new Date();
var searchedValue = jsonPath(
    myJSONStore, 
    "$.[?(@.name == 'myelementname')].elements[?(@.id == 100)].date"
)[0];
console.log(date)
console.log("Get in " + ((new Date().getTime() - startDate.getTime()) / 1000) + "s")

考虑到低数据量,我发现这个延迟真的很长。 我也尝试了这个经典代码,没有 jsonPath

var startDate = new Date();
var searchedValue = null;
for(i in myJSONStore) { 
    if (myJSONStore[i].name == 'myelementname') { 
        for (j in myJSONStore[i].elements) {
            if (myJSONStore[i].elements[j].id == 100) {
                var date = myJSONStore[i].elements[j].date;
                break;
            }
        }
    }
}
console.log(date)
console.log("Get in " + ((new Date().getTime() - startDate.getTime()) / 1000) + "s")

这一次,只用了 1 毫秒

JsonPath 因其简单而简短的语法(如 kiss principle,我很喜欢)而保持其吸引力...但是有没有办法减少计算延迟 ...?大约 4000 倍令人印象深刻

最佳答案

1)在aspx.cs页面中使用下面的代码。

string path= "你的JSON文件路径"; Hiddenfield.Value = File.ReadAllText(路径);

2)之后,尝试在aspx页面中使用下面的代码,即通过隐藏字段获取json对象。

var xyz =$.parseJSON(document.getElementById('<%=Hiddenfield.ClientID%>').value);

关于javascript - Javascript 中的 JSONPath 太长了——比经典循环长大约 3000 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21528685/

相关文章:

javascript - JS 文件显示在源代码中,但 Javascript 没有执行?

javascript - 为什么此选择列表不呈现基于 defaultValue 选择的正确项目

android - 使用 retrofit 2.0 解析嵌套的 json

java - Java 中的优雅降级以避免内存不足错误

javascript - 在数组中查找范围的最有效方法

javascript - 使用 JavaScript 访问本地文件

javascript - 使用 jQuery 获取输入值。可以用,但是确认错误

javascript - 将特定的json元素转换为json中的数字

javascript - 如何从解析的 JSON 数据中获取特定值?

java - 如何加快我的游戏 fps?