我正在嘗試使用動態名稱訪問對象的屬性。 這可能嗎? 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