4 回答

TA贡献1827条经验 获得超4个赞
您可以使用eval()它评估字符串并将其视为节点/变量,假设您已经声明了一个与评估的字符串等效的变量名称。
let data = {
hello: {
world: {
that: {
is: {
something: [1, 2, 3, 4, 5]
}
}
}
},
that: {
is: {
something: {
different: "Noo!!!"
}
}
}
}
let pre_build_keys_1 = "data.hello.world.that.is.something"
let pre_build_keys_2 = "data.that.is.something.different"
console.log(eval(pre_build_keys_1))
console.log(eval(pre_build_keys_2))

TA贡献1900条经验 获得超5个赞
假设数据结构稳定且与示例一致,我认为您已经完成了所有艰苦的工作!在这一点上,您可以评估您想要的确切路径并返回它。
console.log(eval("data.hello.world.that.is.something"));
console.log(eval("data.that.is.something.different"));

TA贡献1856条经验 获得超5个赞
您可以像下面这样创建函数并使用数组getData
传递data
对象。单击此处了解更多关于used in 的信息。key
reduce
getData
function getData(data, keys) {
return keys.reduce((acc, key) => acc[key], data);
}
let pre_build_keys_1 = ["hello", "world", "that", "is", "something"];
let pre_build_keys_2 = ["that", "is", "something", "different"]
let data = {
hello: {
world: {
that: {
is: {
something: [1, 2, 3, 4, 5]
}
}
}
},
that: {
is: {
something: {
different: "Noo!!!"
}
}
}
};
console.log(getData(data, pre_build_keys_1)); // [1, 2, 3, 4, 5]
console.log(getData(data, pre_build_keys_2)); // Noo!!!

TA贡献1836条经验 获得超13个赞
你可以创建一个代理对象来处理从对象中获取适当的项目,然后你可以从字面上做data['hello.world.that.is.something']来获取你想要的东西,就像这样:
let real_data = {
hello: {
world: {
that: {
is: {
something: [1, 2, 3, 4, 5]
}
}
}
},
that: {
is: {
something: {
different: "Noo!!!"
}
}
}
}
const handler = {
get: function(target, prop, receiver) {
let parsed;
try {
parsed = JSON.parse(prop);
} catch (e) {
if (prop.startsWith('[')) {
parsed = prop.substring(1, prop.length - 1);
parsed = parsed.split(', ').join(',').split(',');
} else {
parsed = prop.split('.');
}
}
return parsed.reduce((carry, current) => carry[current], target);
}
};
const data = new Proxy(real_data, handler);
console.log(data['hello.world.that.is.something'])
console.log(data['[that, is, something, different]'])
console.log(data['["that", "is", "something", "different"]'])
添加回答
举报