JavaScript:访问对象的键值

时间:2014-08-06 20:22:40

标签: javascript jquery json angularjs

我的JSON看起来像这样:

 {
    "greeting": {
        "hello": ["world", "josue", "everybody"]
    }
 }

我想知道为什么我不能使用字符串来访问它的属性,如:

var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(obj.str);

以上代码记录未定义。

但是,如果我使用eval()(我真的不想......),它会按预期工作。

var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(eval('obj.'+str));

返回["world", "josue", "everybody"]

为什么我不能使用第一个例子?有没有办法使用第一个示例中显示的字符串访问hello键(不使用eval或修改JSON)?

3 个答案:

答案 0 :(得分:2)

在Angular中,您使用$parse服务(ref):

var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
var getter = $parse(str);
var theValue = getter(obj);

答案 1 :(得分:1)

您正在使用console.log(obj.str);尝试访问对象的“str”属性(不存在)。要访问您要使用的属性console.log(obj["greeting"]["hello"]);obj.greeting.hello。这就是您在评估代码时所做的工作,即评估字符串“obj.greeting.hello”。

你可以写一个这样的函数来做你想要的。

function navigate(str, obj) { 
    var out = obj;
    str.split(".").forEach(function (el) {
        out = out[el];
    });
    return out;
}

答案 2 :(得分:0)

在您的第一个示例中,访问obj.str将尝试访问str obj的{​​{1}}属性(字面"str",而不是str变量的值)。

如果str包含密钥名称,则可以使用括号表示法访问对象属性,如下所示:obj[str]。但是,这种表示法不允许使用像您一样的属性路径。

这是一个拆分属性路径并访问正确属性的函数:

function getProperty(obj, str) {
    var path = str.split(".");
    if (path.length == 0) {
        return undefined;
    }
    var pointer = obj;
    for (var i = 0, l = path.length; i< l; i++) {
        pointer = pointer[path[i]];
    }
    return pointer;
}

现在您可以使用以点分隔的路径访问属性:

var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(getProperty(obj, str));