【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
我正在尝试使用动态名称访问对象的属性。 这可能吗?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
#1楼
在javascript中,我们可以使用:
- 点表示法
foo.bar
- 方括号
foo[someVar]
或foo["string"]
但是只有第二种情况允许动态访问属性:
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
#2楼
更新
我考虑了以下意见并表示同意。 避免评估。
使用obj[variable]
可以轻松实现访问对象的根属性,但是嵌套会使事情复杂化。 不要写已经写好的代码,我建议使用lodash.get
。
例
// Accessing root property
var rootProp = 'rootPropert';
_.get(object, rootProp, defaultValue);
// Accessing nested property
var listOfNestedProperties = [var1, var2];
_.get(object, listOfNestedProperties);
Lodash get可以以多种方式使用,这是指向lodash.get文档的链接
#3楼
以下是一个ES6示例,说明如何使用通过连接两个字符串动态生成的属性名称来访问对象的属性。
var suffix = " name";
var person = {
["first" + suffix]: "Nicholas",
["last" + suffix]: "Zakas"
};
console.log(person["first name"]); // "Nicholas"
console.log(person["last name"]); // "Zakas"
这称为计算属性名称
#4楼
当您还必须将参数传递给此函数时,它会变得很有趣。
代码 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
#5楼
- 点表示法:
something.bar
- 方括号表示法:
something['bar']
方括号之间的值可以是任何表达式。 因此,如果属性名称存储在变量中,则必须使用方括号表示法:
var foo = 'bar';
something[foo];
// both x = something[foo] and something[foo] = x work as expected
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3147879