Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过字符串访问对象成员?_Javascript - Fatal编程技术网

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

假设我们有一个javascript对象

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个以上的子键,也可能会遇到堆栈溢出,但是。