使用变量作为对象引用

时间:2016-05-31 11:07:16

标签: javascript object reference

我在尝试将变量指定为对象引用名称时遇到了一些麻烦。

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子组?

2 个答案:

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