Javascript 使用变量作为对象引用

Javascript 使用变量作为对象引用,javascript,object,reference,Javascript,Object,Reference,尝试将变量指定为对象引用名称时遇到一些问题 var roomName = 'room_' + $(this).data("room-id"); console.log("roomName: " + roomName); beds_required_obj.roomName.single_beds_required = parseInt($(this).val()); My console.log报告如下:“roomName:room_1” 但我一直收到一个错误:“Type

尝试将变量指定为对象引用名称时遇到一些问题

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

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

    beds_required_obj.roomName.single_beds_required = parseInt($(this).val());
My console.log报告如下:
“roomName:room_1”

但我一直收到一个错误:
“TypeError:beds\u required\u obj.roomName未定义”

将变量指定为数组时,我可以使用该变量:

single_beds_required['room ' + $(this).data("room-id")] = parseInt($(this).val());
但在这种情况下,我的对象很混乱,需要额外的处理才能将其拖入整洁的格式服务器端


如何使用变量(在函数中)在全局对象中创建新的obj子组?

通常,控制台中收到的错误不存在。让我们把你的对象分解一下,看看是什么可能导致这个错误

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());
var roomName = 'room_'  + $(this).data('room-id');
beds_required_obj.roomName.single_beds_required = ...
现在,上面的代码首先假设
beds\u required\u obj
是一个存在的对象。从评论中我们可以看出,正如您所使用的,这确实是正确的:

var beds_required_obj = {};
现在,因为这个对象存在,您可以调用
beds\u required\u obj。这里的任何东西
,它都将是有效的代码。但是,您尝试访问的子级可能不存在

接下来,您已经编写了
beds\u required\u 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\u beds\u
。要实现此功能,您需要更改上面的代码以包含一行额外的代码:

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
};

通常,您在控制台中收到的错误并不存在。让我们把你的对象分解一下,看看是什么可能导致这个错误

var roomName = 'room_'  + $(this).data('room-id');
beds_required_obj.roomName.single_beds_required = ...
现在,上面的代码首先假设
beds\u required\u obj
是一个存在的对象。从评论中我们可以看出,正如您所使用的,这确实是正确的:

var beds_required_obj = {};
现在,因为这个对象存在,您可以调用
beds\u required\u obj。这里的任何东西
,它都将是有效的代码。但是,您尝试访问的子级可能不存在

接下来,您已经编写了
beds\u required\u 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\u beds\u
。要实现此功能,您需要更改上面的代码以包含一行额外的代码:

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
};

你差点就成功了。使用
beds\u required\u obj[roomName]。单人床\u required=…
@Matt Wey。。。。是的,我试过了。返回此错误:TypeError:beds_required_obj[roomName]未定义首先使用'beds_required_obj={};'初始化对象@加法器-var beds_required_obj={};已在全局范围内的函数之前声明。您几乎拥有了它。使用
beds\u required\u obj[roomName]。单人床\u required=…
@Matt Wey。。。。是的,我试过了。返回此错误:TypeError:beds_required_obj[roomName]未定义首先使用'beds_required_obj={};'初始化对象@加法器-var beds_required_obj={};已在全局范围中的函数之前声明。