使用点符号变量访问多维对象

时间:2019-06-17 17:15:09

标签: javascript

我有一个像这样的多维对象:

Router.js

import Notes from './notes';
import Users from './users';

const router = {
    Notes,
    Users
};

export default router

每个对象也都有这样的对象:

Notes.js

import Index from '../../components/notes/index'
import Show from '../../components/notes/show'
import Create from '../../components/notes/create'

const routes = {
    index: Index,
    show: Show,
    create: Create
};

export default routes;

现在,我将对象分配给变量:

App.js

import Router from 'Router'

var route = Router
var router = function(name) {
    console.log(route[name]) // undefined when using dotnotation
    console.log(route.Notes.create) // works when I manually do it like this
}

router('Notes.create') // I want to access the Notes.create variable

所以我的问题是,如何将点符号字符串传递给route函数以访问'Notes-> create'元素?

3 个答案:

答案 0 :(得分:1)

您可以拆分字符串并通过迭代键获取值并返回level属性的值。

var router = function(name) {
    console.log(name.split('.').reduce((o, k) => o[k], route));
}

答案 1 :(得分:0)

最好的答案是不要以这种方式使用符号,但是如果您坚持使用它,则可以解析字符串以获取层次结构的每个级别: 然后,您可以使用括号表示法获取属性:

function getPropWithDotNotation(obj, selectorString) {
  let hierarchy = selectorString.split('.');
  let result = obj;
  hierarchy.forEach(level => result = result[level]);
  return result;
}

答案 2 :(得分:0)

您可以创建一个通用函数并检查每个键并获取参考

let a = {
  b : {
    c : 'some value'
  }
}

let findBy = (str) => {
  let keys = str.split('.')
  let i=0;
  let op = a;
  while(i < keys.length){
    op = op[keys[i]]
    if(!op) return op
    i++
  }
  return op
}


console.log(findBy('b'))
console.log(findBy('d'))
console.log(findBy('b.c'))