Javascript 如何通过字符串访问对象成员?
假设我们有一个javascript对象Javascript 如何通过字符串访问对象成员?,javascript,Javascript,假设我们有一个javascript对象 var json = { abc: 1, def: 2, ghi: [3, 4] }; 我们希望访问它的成员,例如给定以下字符串数组 var str_arr = ["json['abc']", "json['ghi'][1]"]; 我想在不使用eval的情况下得到以下结果(我正在构建一个googlechrome扩展) 这可能吗?我试过使用window,但它不起作用(或者可能我不知道如何使用)。谢谢 使用此循环,您可以实现您的要求 str_a
var json = {
abc: 1,
def: 2,
ghi: [3, 4]
};
我们希望访问它的成员,例如给定以下字符串数组
var str_arr = ["json['abc']", "json['ghi'][1]"];
我想在不使用eval的情况下得到以下结果(我正在构建一个googlechrome扩展)
这可能吗?我试过使用window,但它不起作用(或者可能我不知道如何使用)。谢谢 使用此循环,您可以实现您的要求
str_arr.forEach(function(string,index){
str_arr[index] = window.eval(string);
});
console.log(str_arr);
使用此循环可以实现您所要求的
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
];
你可以试试这个
var str_arr = [
(json['abc'])?json['abc']:undefined,
(json['ghi'][1])?json['ghi'][1]:undefined
];
我不建议使用自定义方法遍历整个对象,但如果确实无法直接访问对象,可以使用递归函数传递要打开的键。这可能会给你更多你想要的动态感觉 代码:
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
用法:
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
我不建议使用自定义方法遍历整个对象,但如果确实无法直接访问对象,可以使用递归函数传递要打开的键。这可能会给你更多你想要的动态感觉 代码:
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
用法:
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
这不是json。Json不是一个对象。这是一个javascript对象。Json是一种字符串表示法(JavaScript对象表示法)。i、 它是javascript对象的字符串表示。“{abc:1,def:2,ghi:[3,4]}”将是Json,而不是您所拥有的,aggghhhhh@Liam。改变了问题。谢谢,我要躺在凉快的地方room@IvanWangsa我在回答中使用eval,它不是json。Json不是一个对象。这是一个javascript对象。Json是一种字符串表示法(JavaScript对象表示法)。i、 它是javascript对象的字符串表示。“{abc:1,def:2,ghi:[3,4]}”将是Json,而不是您所拥有的,aggghhhhh@Liam。改变了问题。谢谢,我要躺在凉快的地方room@IvanWangsa我在回答中使用了eval,它正在工作。如果
ghi
键不存在(并非像您认为的那样未定义),则会出现错误。您需要使用json['ghi']&&json['ghi'][1]
以避免抛出错误。可能存在的三维数组也只是解决方案的一个片段,其他您想要的都可以,谢谢您的提醒!如果ghi
键不存在(并非如您所想的未定义),则会出现错误。您需要使用json['ghi']&&json['ghi'][1]
以避免抛出错误。可能存在的三维数组也只是解决方案的一个片段,其他您想要的都可以,谢谢您的提醒!嘿@Omar Mowafi,它起作用了!但我刚刚意识到我忘了添加一个事实,我不能使用eval-我正在构建一个Chrome扩展。非常抱歉(不幸的是,它仍然不起作用。谷歌Chrome在评估方面很严格。嘿@Omar Mowafi,它起作用了!但我刚刚意识到我忘了添加一个事实,即我不能使用评估-我正在构建一个Chrome扩展。非常抱歉!:(不幸的是,它仍然不起作用。我想谷歌Chrome在评估方面很严格。这就是我需要的。谢谢@H2Ooooo!我使用它是为了内部目的,所以我想应该没有什么害处——但为什么这不是一个最佳做法?@IvanWangsa,因为当我们使用自己的方法做一些事情时,它不能优化代码g、 如果我们使用内部JS方法,我们将能够利用已经优化的代码。如果您可以使用内置的东西,则无需重新发明轮子。也就是说,如果这是一个使用V8的chrome插件,则不应成为问题。如果您认为有必要,您可以始终对其进行基准测试。如果您尝试阅读更多内容,也可能会遇到堆栈溢出这是我所需要的。谢谢@H2Ooooo!我使用它是为了内部目的,所以我想应该不会有什么伤害-但是为什么这不是一个最佳实践?@IvanWangsa,因为当我们使用我们自己的方法做某事时,它不能优化代码。如果我们使用内部JS方法,我们就能够利用already优化代码。如果您可以使用内置的东西,则无需重新发明轮子。也就是说,如果这是一个使用V8的chrome插件,则不应成为问题。如果您认为有必要,您可以始终对其进行基准测试。如果您尝试读取X个以上的子键,也可能会遇到堆栈溢出,但是。