javascript - 动态创建多维对象/数组

标签 javascript ajax arrays object multidimensional-array

我正在尝试使用 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 个 undefined:

Form data
undefined:
undefined:

因此,如果我理解正确,对象是否未正确创建,因此,它未使用 Ajax 正确发送。正因为如此,PHP 无法对发布数据做任何事情...

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

最佳答案

您正在混合数组和对象。在 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"
          }
        }
      }
    }
  }
}

关于javascript - 动态创建多维对象/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381543/

相关文章:

javascript - 在react-apollo 查询中使用变量

通过 AJAX 从 Web 服务 (asp.net) 检索数据时出现 Javascript 错误

ruby - 通过 ruby​​ 中的值属性选择哈希值

c++ - 关于非重复 rand 函数

c# - 移除多次出现的数组元素

javascript - 仅适用于浏览器测试仪的正则表达式

javascript - 如何添加指向 <p :submenu>? 的链接

javascript - 如何将 JS 文件链接到 PHP 页面模板?

ajax - Rxjs:如何观察对最后发出的 Ajax 请求的 HTTP 响应

javascript - 异步方法如何工作