我在尝试将变量指定为对象引用名称时遇到了一些麻烦。
var roomName = 'room_' + $(this).data("room-id");
console.log("roomName: " + roomName);
beds_required_obj.roomName.single_beds_required = parseInt($(this).val());
我的console.log按预期报告此"roomName: room_1"
但我一直收到错误:"TypeError: beds_required_obj.roomName is undefined"
我可以在将变量指定为数组时使用该变量:
single_beds_required['room ' + $(this).data("room-id")] = parseInt($(this).val());
但在这种情况下,我的对象很乱,需要额外的处理才能将其拉入整洁的格式服务器端。
如何使用变量(在函数内)在全局对象中创建新的obj子组?
答案 0 :(得分: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 :(得分: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
};