使用变量动态访问对象属性

我正在尝试使用动态名称访问对象的属性。 这可能吗? javascript

const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"

#1楼

在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

#2楼

更新

我考虑了如下意见并表示赞成。 避免评估。 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


#3楼

如下是一个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


#4楼

当您还必须将参数传递给此函数时,它会变得颇有趣。 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

#5楼

两种方法能够访问对象的属性

  • 点表示法: something.bar
  • 方括号表示法: something['bar']

方括号之间的值能够是任何表达式。 所以,若是属性名称存储在变量中,则必须使用方括号表示法:

var foo = 'bar';
something[foo];
// both x = something[foo] and something[foo] = x work as expected
相关文章
相关标签/搜索