假设我们获得了一个javascript对象
var json = {
abc: 1,
def: 2,
ghi: [3, 4]
};
我们想访问其成员,例如给定以下字符串数组
var str_arr = ["json['abc']", "json['ghi'][1]"];
我希望在不使用eval(我正在构建Google Chrome扩展程序)的情况下获得以下结果
var str_res = [1, 4];
这可能吗?我尝试做窗口,但它不起作用(或者我可能不知道如何)。谢谢!
答案 0 :(得分:2)
我不建议使用自定义方法遍历整个对象,但如果您真的无法直接访问该对象,则可以使用递归函数并传递要打开的键。这可能会给你更多你想要的动态感觉。
<强>代码强>:
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
答案 1 :(得分:1)
您可以实现使用此循环所要求的内容
str_arr.forEach(function(string,index){
str_arr[index] = window.eval(string);
});
console.log(str_arr);
答案 2 :(得分:0)
您可以尝试
var str_arr = [
(json['abc'])?json['abc']:undefined,
(json['ghi'][1])?json['ghi'][1]:undefined
];