2016-05-31 96 views
0

我在嘗試將變量指定爲對象引用名稱時遇到了一些問題。如預期使用變量作爲對象引用

,但我不斷收到錯誤"roomName: room_1"

var roomName = 'room_' + $(this).data("room-id"); 

    console.log("roomName: " + roomName); 

    beds_required_obj.roomName.single_beds_required = parseInt($(this).val()); 

我的console.log報告此"TypeError: beds_required_obj.roomName is undefined"

爲數組賦值時,我可以使用變量:

single_beds_required['room ' + $(this).data("room-id")] = parseInt($(this).val()); 

但在這種情況下,我的對象很混亂,需要額外的處理才能將它拉到整潔的服務器端。

如何使用變量(在函數內)在全局對象內部創建新的obj子組?

+1

你幾乎擁有它。使用'beds_required_obj [roomName] .single_beds_required = ...' –

+0

@Matt Wey ....是的,我曾試過。返回此錯誤: TypeError:beds_required_obj [roomName]未定義 – Nick

+0

首先使用'beds_required_obj = {};'初始化對象;' – Adder

回答

1
var beds_required_obj = {}; 

var roomName = 'room_' + $(this).data("room-id"); 

console.log("roomName: " + roomName); 

if(!beds_required_obj[roomName]) beds_required_obj[roomName] = {}; 
beds_required_obj[roomName].single_beds_required = parseInt($(this).val()); 
1

通常,您在控制檯中收到的錯誤不是謊言。所以讓我們打破你的對象,看看有什麼可能導致錯誤。

var roomName = 'room_' + $(this).data('room-id'); 
beds_required_obj.roomName.single_beds_required = ... 

現在上面的代碼首先假定beds_required_obj是一個存在的對象。我們可以通過註釋中看到,這的確是事實,因爲你使用:

var beds_required_obj = {}; 

現在,因爲這個對象存在,你可以打電話beds_required_obj.anything_here,這將是有效的代碼。但是,您嘗試訪問的孩子可能不存在。

接下來你寫了beds_required_obj.roomName。現在,這試圖訪問名爲'roomName',而不是'room_id'的子對象。爲了訪問您存儲在roomName變量中的動態名稱,您需要使用方括號。因此:

beds_required_obj[roomName] 

這將返回動態創建的房間名稱的子對象。

現在取決於roomName究竟是什麼(例如它可能是'room_123'),這個子對象也可能不存在。如果它不存在,則任何訪問此對象的子項的嘗試都將返回您的錯誤。例如,看一下下面的代碼:

var beds_required_obj = []; // create an empty object 
var roomName = 'room_1234'; // the name of our room 

// this line below will throw an error because the room_1234 child object does not exist 
beds_required_obj[roomName].single_beds_required = 2; 

正在發生的事情是,你正在試圖訪問single_beds_required作爲一個未定義的對象的孩子。爲了使這項工作,你就需要更改上面的代碼,包括一個額外的行:

var beds_required_obj = []; // create an empty object 
var roomName = 'room_1234'; // the name of our room 

// now create the room child object 
beds_required_obj[roomName] = {}; 
// now this line will work, as the room is a valid object that can have children assigned to it. 
beds_required_obj[roomName].single_beds_required = 2; 

注意:如果你想要做這樣的事情更可讀的代碼(IMO),那麼我會用:

breds_required_obj[roomName] = { 
    single_beds_required: 2 
};