动态创建多维对象/数组

Posted

技术标签:

【中文标题】动态创建多维对象/数组【英文标题】:creating dynamically multidimensional object / array 【发布时间】:2014-08-14 09:57:57 【问题描述】:

我正在尝试使用 JS 创建一个多维数组,以便我可以通过对 php 的 Ajax 调用发布一些数据。这可能很简单,但是我对JS的了解很少涉及到这个具体的东西......

Here's an JSFiddle with the code

我想要的是某种像这样的数组:

var data = 
    bewaarnaam: 'bewaarnaam!',
    rows: [
        row_1: [
            name: 'Row Name 1',
            x: 450,
            y: 250,
            chest1: [
                counter: 1,
                height: 5
            ],
            chest2: [
                counter: 2,
                height: 3
            ]
        ],
        row_2: [
            name: 'Row Name 2',
            x: 650,
            y: 550,
            chest1: [
                counter: 1,
                height: 8
            ],
            chest2: [
                counter: 2,
                height: 4
            ]
        ],
    ]
;

我正在尝试用这段代码生成对象数组:

function saveThis() 
    var bewaarNaam = $("#bewaarplaatsName").val();
    hide_overlay_save_name();
    log("now where going to save everything with the name: " + bewaarNaam);

    var dataRows = [
        'bewaarnaam': bewaarNaam
    ];
    $(".rows").each(function (i, obj) 
        var row = $(obj);
        var rowName = $(row).attr('name');
        var chests = [];

        $(".cv_chest", row).each(function (i2, obj2) 
            chests[$(obj2).attr('id')] = [
                'counter': $(obj2).attr('chest_counter'),
                    'height': $(obj2).attr('chest_height')
            ];
        );

        var rowData = [
            rowName: [
                'name': $(row).attr('name'),
                    'x': $(row).css('left'),
                    'y': $(row).css('top'),
                    'chests': chests
            ]
        ];

        dataRows[$(row).attr('id')] = rowData;
    );

    log(dataRows);
    log("sending data with ajax...");

    $.ajax(
        type: 'post',
        cache: false,
        url: ' url('
        bewaarplaatsen / nieuw ') ',
        data: dataRows
    ).done(function (msg) 
        log("ajax success");
        log(msg);
    ).fail(function (msg) 
        log("ajax error");
        log(msg);
    );

当我将变量dataRows 输出到控制台时,我得到以下输出:

[Object, row_1: Array[1], row_2: Array[1]]
    0: Object
        bewaarnaam: "Bewaar Naam!"
    __proto__: Object
    length: 1
    row_1: Array[1]
        0: Object
            rowName: Array[1]
                0: Object
                    chests: Array[0]
                        chest_1_1: Array[1]
                            0: Object
                                counter: "1"
                                height: "1"
                                __proto__: Object
                                length: 1

等等…… 如果我使用console.log(JSON.stringify(dataRows)); 记录变量,我会得到以下输出:

[
    "bewaarnaam": "Bewaar Naam!"
]

如果我在控制台内执行var data =... 部分(第一个代码块)并将数据记录到控制台,我会得到以下输出(我使用 `JSON.stringify 函数再次记录它以获得更好的可读性) :


    "bewaarnaam": "Bewaar Naam!",
    "rows": [
        "row_1": [
            "name": "Row Name 1",
            "x": 450,
            "y": 250,
            "chest1": [
                "counter": 1,
                "height": 5
            ],
            "chest2": [
                "counter": 2,
                "height": 3
            ]
        ],
        "row_2": [
            "name": "Row Name 2",
            "x": 650,
            "y": 550,
            "chest1": [
                "counter": 1,
                "height": 8
            ],
            "chest2": [
                "counter": 2,
                "height": 4
            ]
        ]
    ]

如果我在 PHP 中 print_r POST 值,我会得到以下输出:

Array
(
    [undefined] => 
)

当我使用 Chrome 调试 Ajax 请求时,我可以看到 Form Data 得到了 2 个 undefineds

Form data
undefined:
undefined:

所以,如果我理解正确的话,是不是该对象没有正确创建,因此,它没有通过 Ajax 正确发送。正因为如此,PHP 不能对发布的数据做任何事情......

所以我的问题很简单......我做错了什么/我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您正在混合数组和对象。在 javascript 中,如果您使用key:value,您需要一个对象而不是数组。如果你想要[value,value,value],它是一个数组。当您说x=[] 时,您实际上是在 一个数组中创建一个对象,但随后您是在数组上设置属性(数组也是对象),而不是在正确的对象中。

您最可能想要的是在任何地方都使用对象并摆脱所有数组:

http://jsfiddle.net/k5Q3p/1/

var dataRows = 
    'bewaarnaam': bewaarNaam,
    rows:
;

$(".rows").each(function (i, obj) 
    var row = $(obj);
    var rowName = $(row).attr('name');
    var chests = ;

    $(".cv_chest", row).each(function (i2, obj2) 
        log("another chest with id: " + $(obj2).attr('id'));
        chests[$(obj2).attr('id')] = 
            'counter': $(obj2).attr('chest_counter'),
                'height': $(obj2).attr('chest_height')
        ;
    );

    var rowData = 
        rowName: 
            'name': $(row).attr('name'),
                'x': $(row).css('left'),
                'y': $(row).css('top'),
                'chests': chests
        
    ;

    dataRows.rows[$(row).attr('id')] = rowData;
);

创建一个类似的结构


  "bewaarnaam": "Bewaar Naam!",
  "rows": 
    "row_1": 
      "rowName": 
        "name": "Rij 1",
        "x": "30px",
        "y": "120px",
        "chests": 
          "chest_1_1": 
            "counter": "1",
            "height": "3"
          ,
          "chest_1_2": 
            "counter": "2",
            "height": "3"
          ,
          "chest_1_3": 
            "counter": "3",
            "height": "3"
          ,
          "chest_1_4": 
            "counter": "4",
            "height": "3"
          ,
          "chest_1_5": 
            "counter": "5",
            "height": "3"
          
        
      
    ,
    "row_2": 
      "rowName": 
        "name": "Rij 2",
        "x": "30px",
        "y": "200px",
        "chests": 
          "chest_2_1": 
            "counter": "1",
            "height": "6"
          ,
          "chest_2_2": 
            "counter": "2",
            "height": "6"
          ,
          "chest_2_3": 
            "counter": "3",
            "height": "6"
          ,
          "chest_2_4": 
            "counter": "4",
            "height": "6"
          
        
      
    
  

【讨论】:

非常感谢!如前所述,我对 Js 知之甚少,所以我不知道我在搞砸对象和数组。感谢您为我指出这一点并提供修复。祝您有愉快的一天!

以上是关于动态创建多维对象/数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何修改动态多维数组

如何使用 jquery 创建具有来自动态创建的表单字段的值的多维数组?

怎么使用new操作符创建动态数组?

动态访问多维数组值

动态多维数组自行覆盖

如何将多维动态数组传递给C++中的函数