【问题标题】:Unpredictable hierarchy in JSON objectJSON 对象中不可预测的层次结构
【发布时间】:2009-08-17 20:58:04
【问题描述】:

在构建 ajax 应用程序时,我通常更喜欢以 JSON 格式获取远程数据。然而,当层次结构不可预测时(specifically geocoding responses from Google Maps API),使用 XML 格式很诱人,因为 DOM 方法 getElementsByTagName 将获取层次结构中的任何数据。假设只有一个带有我感兴趣的标签/名称的元素/属性,以下函数是否有效等效于 getElementsByTagName?如何改进?

function findProperty(obj,prop){

        for(var p in obj){
            if(p==prop){
                    return obj[p];
            }
            if(obj[p] instanceof Object){
                var tmp = findProperty(obj[p],prop);
                if(tmp){
                    return tmp;
                }
            }

        }
}

【问题讨论】:

    标签: javascript xml ajax json dom


    【解决方案1】:

    您的函数似乎是一个非常直接的线性搜索,许多 DOM 遍历函数都会这样做。也就是说,您应该添加一个 hasOwnProperty 检查以避免从原型树中获取属性。例如

    for(var p in obj) {
       if(obj.hasOwnProperty(p)) {
          ...
       }
    }
    

    此外,总是在 JS 中使用 === 而不是 ==(这避免了相当糟糕的 JS 中的类型强制)。我也不确定 instanceof 语句是否按照您的想法执行。您可能想要使用:

    obj[o].constructor === Object
    

    改为。

    【讨论】:

    • instanceof 应该与constructor 相同,请在此处检查,尽管两者都无法“匹配”来自其他帧的对象。还记得 hasOwnProperty 在一些较旧的客户端中丢失,例如 Safari
    • instanceof 应该 相同,但作为 FF 3.5 下的示例,以下将返回 false: "as" instanceof String 而这将返回 true: "as".constructor === 字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多