如何将字符串中的链式属性转换为javascript中的变量

How to convert chained property from string into a variable from javascript

本文关键字:转换 变量 javascript 属性 字符串      更新时间:2024-01-01

我有一个存储在字符串中的变量

  var employee  = {
        name: 'person',
        job: {
           post: 'developer',
           since: 2010,
           desk: {
              number: '1',
        }
    }
  };

如何从字符串中获取密钥链值,例如

  var variable = "job.desk.number";
  console.log(variable);
  //this should return 1

更新3!!

@T.J.克劳德的答案实际上是最好的答案。

他的工作既快捷又整洁太可怕了!

拆分字符串,使您有一个键数组,然后循环遍历它们,依次从对象中获取每个键,记住从对象中获得的最后一件事:

var value = variable.split('.').reduce(function(prev, key) {
  return prev[key];
}, employee);
snippet.log(value);

示例:

var employee  = {
  name: 'person',
  job: {
    post: 'developer',
    since: 2010,
    desk: {
      number: '1',
    }
  }
};
var variable = "job.desk.number";
var value = variable.split('.').reduce(function(prev, key) {
  return prev[key];
}, employee);
snippet.log(value);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

请注意,Array#reduce是ES5,所以它在所有现代浏览器中都有,但在一些旧浏览器中没有。不过,它可以用垫片/聚乙烯填充。或者,如果您只是喜欢使用for循环:

var keys = variable.split('.');
var value = employee;
var index;
for (index = 0; index < keys.length; ++index) {
    value = value[keys[index]];
}
snippet.log(value);

示例:

var employee  = {
  name: 'person',
  job: {
    post: 'developer',
    since: 2010,
    desk: {
      number: '1',
    }
  }
};
var variable = "job.desk.number";
var keys = variable.split('.');
var value = employee;
var index;
for (index = 0; index < keys.length; ++index) {
    value = value[keys[index]];
}
snippet.log(value);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

例如,假设您的变量emplyee类似

var employee = "{ name: 'person', job: { post: 'developer', since: 2010, desk: { number: '1', } } }";

实际上是一个字符串,那么您需要使用JSON.parse(employee) 将其解析为JSON

你可以像一样访问你的变量

var variable = employee.job.desk.number

您的案例的替代方案是:

var variable = "" + employee.job.desk.number;

结果确实有效,但我想知道性能如何。

 var _getKeyChainValueFromObject = function (keychain, root) {
    var items = [];
    if (keychain.indexOf(".") > 0)
        items = keychain.split(".");
    else
        return root[keychain];
    for (var i = 0; i < items.length ; i++) {
        for (var property in root) {
            var key = items[i];
            if (property === key) {
                if (typeof (root[property]) === "object") {
                    var scope = root[property];
                    items.splice(0, 1);
                    //get the resource recursively 
                    return _getKeyChainValueFromObject(items.join('.'), scope);
                }
            }
        }
    }
};

我找到了一个更好的解决方案,可以处理对象和对象数组。

const userObject = {
  user: {
    name: "Victor",
    posts: [
      {
        title: "Post #1",
        description: "........"
      },
      {
        title: "Post #2",
        description: "........"
      }
    ]
  }
};
const path = "user.posts[0].title";
const valueByPath = path.match(/'d+|'w+/gm).reduce(function (prev, key) {
  return prev[key];
}, userObject);
console.log(valueByPath);