【问题标题】:How to make array of objects in JS如何在JS中制作对象数组
【发布时间】:2017-07-19 02:08:00
【问题描述】:

我想通过 AJAX 发送一个多级数组。所以我尝试制作如下对象的对象:

var info = {};

info.pickup = {};
info.pickup.contact = {};
info.pickup.items_quantity = {};
info.pickup.items = {};

info.delivery = {};
info.delivery.contact = {};
info.delivery.level = {};

然后我开始填充对象,例如:

$('.operation-create .pickup .contact-details').each(function () {
    var arr = {};
    arr['contact_name'] = $(this).find('input[name="pickup-contact-name"]').val();
    arr['contact_phone'] = $(this).find('input[name="pickup-contact-phone"]').val();
    arr['pickup-suburb'] = $(this).find('select[name="pickup-suburb"]').val();
    arr['single-pickup-address'] = $(this).find('input[name="single-pickup-address"]').val();
    info.pickup.contact.push(arr);
});
info.pickup.push(info.pickup.contact);

等等……

但不幸的是,它没有用。我收到此错误:

info.pickup.contact.push 不是函数

我应该在这里做什么?通过 AJAX 发送这个数组的正确方法是什么?

【问题讨论】:

  • contact更改为数组:info.pickup.contact = [];
  • 您的数据结构有点不清楚,因为您将info.pickup 用作带有推送对象的数组,例如info.pickup.contact,同时您将其用作具有自定义属性的普通对象。跨度>
  • @NinaScholz 我真的不擅长 js 对象,这就是为什么我对声明这些数组感到困惑

标签: javascript jquery arrays javascript-objects


【解决方案1】:

你需要一个数组作为值

info.delivery.contact = [];
//                      ^^

最后一行

info.pickup.push(info.pickup.contact);

没有意义,因为你在这个对象中有属性。要推送一些值,您需要一个数组

info.pickup = [];
//            ^^

虽然您已经有 info.pickup.contact 的数组,但您可以跳过该行

info.pickup.push(info.pickup.contact);

【讨论】:

    【解决方案2】:

    了解对象和数组之间的区别很重要。

    {} 创建一个没有push 方法的普通对象。

    [] 创建一个数组,这是一个具有附加功能的对象,包括 push 方法。

    查看您的代码,至少,您希望 info.pickup.contact 并且可能 info.delivery.contact 是数组(我猜可能 items_quantityitems 也是如此,但它是很难确定)。 (您在循环函数中调用 arr 的东西不是数组,也不需要。)

    所以至少:

    info.pickup.contact = [];
    // -------------------^^
    

    info.delivery.contact = [];
    // ---------------------^^
    

    您还想删除最后的info.pickup.push(info.pickup.contact);info.pickup 不是数组,您已经将联系人放入 info.pickup.contact


    旁注:您的代码也可能受益于使用对象初始化器:

    var info = {
        pickup: {
            contact: [],
            items_quantity: {},    // This might also want to be an array
            items: {}              // This might also want to be an array
        },
        delivery: {
            contact: [],
            level: {}              // No idea what you're doing with this, so...
        }
    };
    
    $('.operation-create .pickup .contact-details').each(function () {
        info.pickup.contact.push({
            contact_name: $(this).find('input[name="pickup-contact-name"]').val(),
            contact_phone: $(this).find('input[name="pickup-contact-phone"]').val(),
            pickup-suburb: $(this).find('select[name="pickup-suburb"]').val(),
            single-pickup-address: $(this).find('input[name="single-pickup-address"]').val()
        });
    });
    

    ...但这是风格问题。

    【讨论】:

    • 是的,他们想成为一个数组,谢谢你的解释
    【解决方案3】:
    info.pickup.contact = {};
    

    这是一个对象声明,而不是数组。

    数组应该是

    info.pickup.contact = [];  // `[]`
    

    【讨论】:

      【解决方案4】:

      正如其他答案所述,您需要将contact 从对象(即{})更改为数组([])。

      另外注意,你可以使用jQuery的map()来构建数组,让代码更简洁一点:

      info.pickup.contact = $('.operation-create .pickup .contact-details').map(function () {
        return {
          contact_name: $(this).find('input[name="pickup-contact-name"]').val(),
          contact_phone: $(this).find('input[name="pickup-contact-phone"]').val(),
          pickup-suburb: $(this).find('select[name="pickup-suburb"]').val(),
          single-pickup-address: $(this).find('input[name="single-pickup-address"]').val()
        }
      }).get();
      

      【讨论】:

        【解决方案5】:

        您需要一个数组才能将一个元素推入其中。这里是对象,所以显然你不可能添加。

        如果要添加,则将其设置为类似数组

        info.pickup.contact = [];
        

        现在,如果您添加,那么它将接受。添加后,您的数组将如下所示..

        info.pickup.contact = [];
        info.pickup.contact.push("Sample");
        
        {"pickup":{"contact":["Sample"]}}
        

        【讨论】:

          猜你喜欢
          • 2022-08-09
          • 2021-09-06
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-17
          • 2022-11-27
          相关资源
          最近更新 更多