如何通过字符串访问对象成员

How can I access object members via a string?

本文关键字:对象 成员 访问 字符串 何通过      更新时间:2023-09-26

假设我们得到一个javascript对象

var json = {
  abc: 1,
  def: 2,
  ghi: [3, 4]
};

我们想访问它的成员,例如给定以下字符串数组

var str_arr = ["json['abc']", "json['ghi'][1]"];

我想在不使用eval的情况下得到以下结果(我正在构建一个谷歌Chrome扩展)

var str_res = [1, 4];

这可能吗?我试着做窗户,但不起作用(或者可能我不知道怎么做)。谢谢

我不建议使用自定义方法迭代整个对象,但如果你真的不能直接访问对象,你可以使用递归函数并传递你想要打开的键。这可能会给你更多你想要的动态感觉。

代码

function readObjectValue(obj, key, defaultValue) {
    function __readObjectValueInternal(obj, keyParts, defaultValue) {
        if (!obj.hasOwnProperty(keyParts[0])) {
            return defaultValue;
        }
        var readValue = obj[keyParts[0]];
        if (typeof(readValue) !== 'object') {
            return readValue;
        }
        return __readObjectValueInternal(readValue, keyParts.slice(1), defaultValue);
    };
    return __readObjectValueInternal(
        obj, 
        (typeof(key) === 'string' ? key.split(/'./g) : key), 
        defaultValue
    );
}

用法

var json = {
  abc: 1,
  def: 2,
  ghi: [3, 4]
};
console.log( readObjectValue(json, 'abc')            ); // 1
console.log( readObjectValue(json, 'ghi.1')          ); // 4
console.log( readObjectValue(json, 'ghi.2')          ); // undefined
console.log( readObjectValue(json, 'ghi.3', null)    ); // null
console.log( readObjectValue(json, ['def', 0], null) ); // 2

使用这个循环可以实现您所要求的

str_arr.forEach(function(string,index){
  str_arr[index] = window.eval(string);
});
console.log(str_arr);

您可以尝试这个

var str_arr = [
(json['abc'])?json['abc']:undefined,
(json['ghi'][1])?json['ghi'][1]:undefined
];