如何使用JS 的模板字符串的拼接来获取对象某个属性的值,如拼接出 obj[a][b][c] 这种?

如何使用JS 的模板字符串来获取对象某个属性的值,如拼接出 obj[a][b][c] 这种,其中 a/b/c 的个数是不定的,所以 obj后面该如何拼接呢?

如果直接是

const obj = {
    a: {
        b: {
            c: 1
        }
    }
}
const str = 'a.b.c';
const tpl = obj`${str.split('.')}` ;

这时候会报错 obj 不是一个 function
那该怎么来拼接呢,能够直接使用模板函数来直接得到 obj.a.b.c 的值
注:不使用循环来获取obj 的值,比如使用 map / reduce / while 来获取,也就是不使用 lodash 中 get 的方式,现在想的是如何来根据模板字符串来获取,想探讨一下这种形式

阅读 3.8k
5 个回答

一种不太推荐的写法with(obj){eval(str)},就是在with中让str以代码的形式运行,eval还可以换成new Function

纯模板字符串实现不了,语言特性如此,最好使用循环来获取值

其实正确的是 obj["a"]["b"]["c"]
所以

const obj = {
    a: {
        b: {
            c: 1
        }
    }
}
const str = 'a.b.c';
a=str.split('.');
t=obj;
for( i in a){
  t=t[a[i]];
}
const tpl=t;
const obj = {
  a: {
      b: {
          c: 1
      }
  }
}
const str = 'a.b.c'
const fn = new Function('obj','str',`return obj.${str}`)
console.log('🚀 ~ fn', fn(obj,str))

我写过一个正适合:https://github.com/hungtcs/pi...
另外可以用: https://lodash.com/docs/4.17....

如果用上面我写的 pico-sandbox 的话

import { Sandbox } from 'pico-sandbox';

function get(object: any, path: string) {
  return Sandbox.compile(path)(object);
}

const result = get({ a: { b: { c: 1 } } }, 'a.b.c');
// or
const result = get({ a: { b: { c: 1 } } }, 'a["b"]["c"]');

直接用 lodash 吧,哈哈

const obj = {
    a: {
        b: {
            c: 'hello'
        }
    }
}

_.get(object, 'a.b.c');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题