如何使用字符串访问对象的嵌套属性?



我有以下字符串:

const str = "prop1.prop2.prop3"

我想使用这个字符串来访问以下对象的属性prop3:

const obj = {
prop1: {
prop2:{
prop3:{
// ---- destination point
}
}
}
}

但是我不知道该怎么做?肯定有什么东西在不断地增加obj[currentProp],等等。和. .没有更快的方法吗?恐怕我是在把时间浪费在一些更容易完成的事情上。

这就是我的方法:

const access = (path, object) => {
return path.split('.').reduce((o, i) => o[i], object)
}
const obj = {
prop1: {
prop2: {
prop3: {
value: 'foo'
}
}
}
}
const str = 'prop1.prop2.prop3'
console.log(access(str, obj)) // {"value": "foo"}

splitforEach的组合方式如下:

const str = "prop1.prop2.prop3"
const obj = {
prop1: {
prop2:{
prop3:{
a: "b",
c: "d"
}
}
}
}
var srch = obj;
str.split(".").forEach(item => (srch = srch[item]));
console.log(srch); // { a: "b", c: "d"}
console.log(obj);

splitstr转换的值为一个数组,然后循环在每个迭代中,srch更深一层。

访问对象嵌套属性的不同方式

使用函数accessDeepProp和两个参数嵌套属性的对象和路径!

递归方法:

function accessDeepProp(obj, path) {
if (!path) return obj;
const properties = path.split(".");
return accessDeepProp(obj[properties.shift()], properties.join("."));
}

循环方式:

function accessDeepProp(obj, path) {
const properties = path.split(".");
for (let i = 0; i < properties.length; i++) {
if (!obj) return null;
obj = obj[properties[i]];
}
return obj;
}

Eval方式:never_use_eval!

function accessDeepProp(objName, path) {
try {
return eval(`${objName}.${path}`);
} catch (e) {
return null;
}
}

你也可以使用lodash get方法

这是最短的解决方案,它支持数组和['括号符号']。只是不要针对恶意用户输入运行它。

更新:没有eval的更好(?)版本。

const obj = {
prop1: {
prop2: {
prop3: {
value: 'foo'
}
}
}
}
const str = 'prop1.prop2.prop3'
//console.log(eval("obj." + str))
// a code without eval
var value = (Function("return obj." + str))();
console.log(value);

相关内容

  • 没有找到相关文章