我正在尝试使用动态名称访问对象的属性。 这可能吗? javascript
const something = { bar: "Foobar!" }; const foo = 'bar'; something.foo; // The idea is to access something.bar, getting "Foobar!"
在javascript中,咱们能够使用: java
foo.bar
foo[someVar]
或foo["string"]
可是只有第二种状况容许动态访问属性: app
var foo = { pName1 : 1, pName2 : [1, {foo : bar }, 3] , ...} var name = "pName" var num = 1; foo[name + num]; // 1 // -- var a = 2; var b = 1; var c = "foo"; foo[name + a][b][c]; // bar
我考虑了如下意见并表示赞成。 避免评估。 ide
使用obj[variable]
能够轻松实现访问对象的根属性,可是嵌套会使事情复杂化。 不要写已经写好的代码,我建议使用lodash.get
。 函数
例 this
// Accessing root property var rootProp = 'rootPropert'; _.get(object, rootProp, defaultValue); // Accessing nested property var listOfNestedProperties = [var1, var2]; _.get(object, listOfNestedProperties);
Lodash get能够以多种方式使用,这是指向lodash.get文档的连接 idea
如下是一个ES6示例,说明如何使用经过链接两个字符串动态生成的属性名称来访问对象的属性。 spa
var suffix = " name"; var person = { ["first" + suffix]: "Nicholas", ["last" + suffix]: "Zakas" }; console.log(person["first name"]); // "Nicholas" console.log(person["last name"]); // "Zakas"
这称为计算属性名称 .net
当您还必须将参数传递给此函数时,它会变得颇有趣。 code
代码 jsfiddle
var obj = {method:function(p1,p2,p3){console.log("method:",arguments)}} var str = "method('p1', 'p2', 'p3');" var match = str.match(/^\s*(\S+)\((.*)\);\s*$/); var func = match[1] var parameters = match[2].split(','); for(var i = 0; i < parameters.length; ++i) { // clean up param begninning parameters[i] = parameters[i].replace(/^\s*['"]?/,''); // clean up param end parameters[i] = parameters[i].replace(/['"]?\s*$/,''); } obj[func](parameters); // sends parameters as array obj[func].apply(this, parameters); // sends parameters as individual values
something.bar
something['bar']
方括号之间的值能够是任何表达式。 所以,若是属性名称存储在变量中,则必须使用方括号表示法:
var foo = 'bar'; something[foo]; // both x = something[foo] and something[foo] = x work as expected