javascript - 如何返回对象中属性的命名空间路径?

标签 javascript

我正在尝试创建一个函数来“解析”对象中嵌套属性的点分隔路径。

假设您有以下对象:

var obj = {
    A: {
        A_1: {
        },
        A_2: {
            A_2_a: {},
            A_2_b: {
                A_2_b_1: {},
                A_2_b_2: {},
            }
        },
        A_3: {},
    },
    B: {
        B_1: {
        },
        B_2: {
            B_2_a: {
            },
            B_2_b: {
                B_2_b_1: {},
                B_2_b_2: {},
            }
        },
        B_3: {},
    },
};

我想在对象上调用一个函数,例如 resolve(obj, "B_2_b_2") 并让它返回属性的完整对象路径,即:B.B_2.B_2_b .B_2_b_2

最佳答案

假设一个命名约定,就像在您的示例对象中一样:

function resolve(id) {
    var parts = id.split("_");
    var path = [];
    for (var i=0; i<parts.length; i++)
        path.push(parts.slice(0, i+1).join("_"));
    return path;
}

> resolve("B_2_b_2")
["B", "B_2", "B_2_b", "B_2_b_2"]
> resolve("B_2_b_2").join(".")
"B.B_2.B_2_b.B_2_b_2"

使用路径数组,您可以轻松地递归嵌套对象以获取属性值。


数据对象中的树搜索是微不足道的。但是,我们可以通过假设命名约定来优化它:

function resolve(obj, id) {
    if (id in obj)
        return [id]; // we've found it
    var path;
    for (var l=id.length-1; l>0; l--) {
        var sub = id.substr(0, l);
        if (sub in obj && (path = resolve(obj[sub], id))) {
            path.unshift(sub);
            return path;
        }
    }
    for (var prop in obj) {
       if (path = resolve(obj[prop], id)) {
            path.unshift(prop);
            return path;
        }
    }
    return null;
}

关于javascript - 如何返回对象中属性的命名空间路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694756/

相关文章:

javascript - 世博会文字转语音语音信息

javascript - Jquery 放一个弹出窗口,直到加载整个页面

javascript - AngularJS 数组中的第一个过滤器之后

javascript - 设置相机宽度和高度 phonegap 相机

javascript - 在 Highcharts 上使用 XY 缩放时,如何隐藏未选定的系列和轴?

javascript - jQuery 在循环内加载模板

javascript - 如何使用 JavaScript 检查 html 元标记是否存在?

javascript - jquery无法获取隐藏字段数据

javascript - 使用 jquery 访问 iframe 的 <table>

javascript - HTML/JavaScript : How to make default text of a &lt;textarea&gt; undeletable?