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

时光总嘲笑我的痴心妄想 提交于 2019-12-26 22:20:30

【推荐】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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!