gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:10:30 25 4
gpt4 key购买 nike

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

假设您有以下对象:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com