我的目标是:
如果我有参考文献
a: {
b: {
c:{
d: {
//Some properties here.
}
}
}
}
然后通过使用类似"a.b.c.d"
的字符串(事先未知),我希望能够横切对象并获得d
的值(或返回null
/抛出Error
)。
我知道我们总是可以获取下面一个深度的值(例如a["b"]
,依此类推),然后可以肯定地使用.split()
然后使用循环或递归来实现,但我希望有一个更简单的一步方法。
答案 0 :(得分:1)
没有其他方法可以做到不使用循环就是递归。 eval()
可以这样做,但不建议这样做。
const getProp = (obj,path) => path.split('.').reduce((ac,a) => (ac || {})[a],obj);
const obj = { a: {
b: {
c:{
d: {
someprop:"x"
}
}
}
}
}
console.log(getProp(obj,"a.b.c.d"))
另一种方式可以使用Proxy()
,但我仍然会说reduce()
更好。
const obj = {
a: {
b: {
c:{
d: {
someprop:"x"
}
}
}
}
}
const handler = {
get:function(obj,prop){
if(prop.includes('.')) return prop.split('.').reduce((ac,a) => (ac || {})[a] ,obj)
else return obj[prop]
}
}
let res = new Proxy(obj,handler);
console.log(res['a.b.c.d'])
基于注释“ a.b.c.d
未知” 。
const obj = {
a: {
b: {
c:{
d: {
someprop:"x"
}
}
}
}
}
const getProp = (obj,depth) => [...Array(depth)].reduce((ac,a) => (Object.values(ac)[0] || {}),obj)
console.log(getProp(obj,4))
答案 1 :(得分:0)
是的,有一个简单的解决方案,将字符串放入eval并将eval放入try / catch
const a = {b:{c:{d:"test"}}};
try{
console.log(eval("a.b.c.d")); // test
}catch(e){}
答案 2 :(得分:0)
正如您所提到的,密钥是事先未知的,因此可以使用递归或循环:
然后使用“ a.b.c.d”之类的字符串(事先未知), 我希望能够横切对象并获得d的值(或 返回null /抛出错误)。
const object = {
a: {
b: {
c:{
d: {
foo : "bar"
}
}
}
}
};
function getNestedData(obj){
if(!obj){
return null;
}
if(Object.values(obj).filter(val => typeof val !== "object").length){
return (Object.values(obj)[0] || {});
}
return getNestedData(Object.values(obj)[0] || {});
}
console.log(getNestedData(object));