gpt4 book ai didi

javascript - JavaScript 对象的动态深度选择

转载 作者:数据小太阳 更新时间:2023-10-29 04:59:36 24 4
gpt4 key购买 nike

使用单个属性这很容易:


var jsonobj = {
"test": "ok"
}
var propname = "test";
// Will alert "ok"
alert(jsonobj[propname]);

但我想做的是使用嵌套属性:


var jsonobj = {
"test": {
"test2": "ok"
}
}
var propname = "test.test2";
// Alerts undefined
alert(jsonobj[propname]);

有什么方法可以选择嵌套的“动态”属性吗?我知道我可以做 jsonobj.test.test2,但问题是 propname 可以更改为 1,2 或 3 级深度的属性。 (例如测试、test.test2、...)

最佳答案

function resolve(cur, ns) {

var undef;

ns = ns.split('.');

while (cur && ns[0])
cur = cur[ns.shift()] || undef;

return cur;

}

例如

// 1:
resolve({
foo: { bar: 123 }
}, 'foo.bar'); // => 123


// 2:
var complex = {
a: {
b: [
document.createElement('div')
]
}
};

resolve(complex, 'a.b.0.nodeName'); // => DIV

使用它的好处是,如果您尝试访问不存在的内容,它不会抛出错误——它会优雅地返回 undefined


编辑:

在评论中,Andy 提到这不会像人们预期的那样抛出错误。我同意获取 undefined 有点笼统,没有办法判断您的值是否真正得到解决。所以,要解决这个问题,试试这个:

var resolve = (function(){

var UNRESOLVED = resolve.UNRESOLVED = {};
return resolve;

function resolve(cur, ns) {

var undef;

ns = ns.split('.');

while (cur && ns[0])
cur = cur[ns.shift()] || undef;

if (cur === undef || ns[0]) {
return UNRESOLVED;
}

return cur;

}

}());

它将返回一个 UNRESOLVED 对象,可以像这样检查:

var result = resolve(someObject, 'a.b.c');

if (result === resolve.UNRESOLVED) {...}

它并不完美,但它是 (IMO) 确定未解析命名空间而不必抛出错误的最佳方法。如果您想要错误,请继续:

someObject.a.b.c; //...

关于javascript - JavaScript 对象的动态深度选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344392/

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