JS获取对象的嵌套属性,名称中包含空格

时间:2015-08-13 11:01:20

标签: javascript

鉴于这种结构:

{  
    "foo":{  
        "bar":{  
            "baz":[  
                {  
                    "foo bar":"baz",
                    "baz foo":"bar"
                }
            ]
        }
    }
}

如何从变量中选择'foo bar',例如:

var myString = "baz[0]['baz foo']";

有许多使用点表示法的例子:

Accessing nested JavaScript objects with string key

Access / process (nested) objects, arrays or JSON

Reference Nested JavaScript Object

但似乎没有人支持带空格的键。

示例JS fiddle

2 个答案:

答案 0 :(得分:3)

baz是一个对象数组



var obj = {  
    "foo":{  
        "bar":{  
            "baz":[  
                {  
                    "foo bar":"baz",
                    "baz foo":"bar"
                }
            ]
        }
    }
};
var myString = obj.foo.bar.baz[0]['baz foo'];
alert(myString);




<强>更新
您可以使用.eval()方法。

&#13;
&#13;
var obj = {  
    "foo":{  
        "bar":{  
            "baz":[  
                {  
                    "foo bar":"baz",
                    "baz foo":"bar"
                }
            ]
        }
    }
};
var myString = "obj.foo.bar.baz[0]['baz foo']";
alert(eval(myString));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

问题在于解析属性的路径,因为使用split会忽略[]和&#34;&#34;。此正则表达式prop.match(/[^.\[\]'"]+/g)提取所有道具(fiddle):

function getProperty(obj, prop) {
    var parts = prop.match(/[^.\[\]'"]+/g),
        i = 0,
        current = parts[0];

    var currentValue = obj;

    while (currentValue[current]) {
        currentValue = currentValue[current];

        current = parts[++i];
    }

    if(i < parts.length) {
        return undefined;
    }

    return currentValue;
}

我确信我没有得到所有边缘案例和错误,但这是一个很好的起点。您还应该检查lodash _.get,它就是这样做的。