2015-10-17 115 views
1

我想在JS中製作一種「購物清單」。我無法通過函數的參數訪問對象。用JavaScript函數參數訪問對象

shopList = { 
 
    create: function createList(listName) { 
 
    listName = {}; 
 
    listName["Banana"] = 2 
 
    }, 
 

 
    output: function output(listName) { 
 
    console.log(listName) 
 
    }, 
 

 
}; 
 

 
shopList.create('list') 
 
shopList.output('list')

當我運行shopList.output '名單' 返回。如何通過參數訪問對象?希望這不是重複的,現在幾個小時一直在Google上搜索,並沒有取得任何進展。

+0

'過度的說法'? – ergonaut

+0

對不起,英語不是我的母語。就像通過爭論一樣訪問它。 –

+0

對於您想要的輸出示例可能會更好。 – ergonaut

回答

5

如果您希望能夠使用動態名稱配置列表,則需要使用bracket notationthis對象內創建列表。就像這樣:

var shopList = { 
 
    create: function createList(listName) { 
 
     this[listName] = {}; 
 
     this[listName]["Banana"] = 2 
 
    }, 
 

 
    output: function output(listName) { 
 
     return this[listName]; 
 
    } 
 
}; 
 

 
shopList.create('list'); 
 
console.log(shopList.output('list'));

然而,正如在評論中指出的@armchairdj,最好創建一個容器專用屬性來保存列表:如果你想避免

var shopList = { 
    lists: {}, 

    create: function createList(listName) { 
     this.lists[listName] = {}; 
     this.lists[listName]["Banana"] = 2 
    }, 

    output: function output(listName) { 
     return this.lists[listName]; 
    } 
}; 
+0

啊非常感謝你!像魅力一樣工作:) –

+0

第二個'console.log()'不是必須的,因爲'output()'已經記錄它而不是'返回'。 –

+0

@JonathanLonowski我認爲這是有道理的回報,所以不是:) – dfsq

2

通過天真​​地添加任意的用戶提供的鍵來打破showList對象的方法,你應該爲你的列表創建一個內部命名空間。

var shopList = { 
 
    lists: {}, 
 

 
    create: function (listName) { 
 
    this.lists[listName] = this.lists[listName] || {}; 
 

 
    this.lists[listName].Banana = 2; 
 
    }, 
 

 
    output: function (listName) { 
 
    var list = this.lists[listName]; 
 

 
    if (!list) { 
 
     return console.log('No list named ' + listName + ' found.'); 
 
    } 
 

 
    console.log(list) 
 
    } 
 
}; 
 

 
shopList.create('output'); 
 
shopList.output('output'); 
 
shopList.create('foo'); 
 
shopList.output('foo'); 
 
shopList.output('bar');