使用變量動態訪問對象屬性

我正在嘗試使用動態名稱訪問對象的屬性。 這可能嗎? 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
相關文章
相關標籤/搜索