【问题标题】:jquery push into multidimensional array from loopjquery从循环推入多维数组
【发布时间】:2018-01-09 04:13:29
【问题描述】:

我正在尝试通过执行以下操作在 for 循环中创建一个数组:

var newArr = [];
for(var j=0; j < ChargeTypes.ChargeType.length; j++){
    var ChargeTypeId = ChargeTypes.ChargeType[j].ChargeTypeId;
    var Date = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].Date;
    var NoOfRoomsAvailable = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].NoOfRoomsAvailable;
    newArr.push({ChargeTypeId},{Date});
    newArr.push({ChargeTypeId},{NoOfRoomsAvailable});
};
alert( JSON.stringify(newArr) );

这是在创造:

[
    {"ChargeTypeId":"1"},
    {"Date":"2017-12-28"},
    {"ChargeTypeId":"1"},
    {"NoOfRoomsAvailable":"0"},
    {"ChargeTypeId":"23"},
    {"Date":"2017-12-28"},
    {"ChargeTypeId":"23"},
    {"NoOfRoomsAvailable":"3"}
]

但我希望得到这样的东西:

[1] //ChargeTypeID
    {
        Date:"2017-12-28",
        NoOfRoomsAvailable:"0"
    },
[23] //ChargeTypeID
    {
        Date:"2017-12-28",
        NoOfRoomsAvailable:"3"
    }

我试过用这个:

newArr[ChargeTypeId].push("Date",Date);
newArr[ChargeTypeId].push("NoOfRoomsAvailable",NoOfRoomsAvailable);

但我收到此错误:

TypeError: newArr[ChargeTypeId] 未定义

我显然遗漏了一些东西,这可能是一些小东西,哈哈,但如果有人能帮助我,那就太好了。

【问题讨论】:

  • 已编辑答案,请检查

标签: jquery for-loop multidimensional-array


【解决方案1】:

您面临的问题是 JS 不像其他一些语言那样支持关联数组。相反,JS 有对象,你必须忍受它。此时您可以做的最好的事情是创建:

$obj = [
    {"ChargeTypeId":"1", "Date":"2017-12-28", "NoOfRoomsAvailable":"0"},
    {"ChargeTypeId":"23", "Date":"2017-12-28", "NoOfRoomsAvailable":"3"}
]

然后您可以将 ID 引用为obj.ChargeTypeId。这可以通过以下方式实现:

var newArr = [];
for(var j=0; j < ChargeTypes.ChargeType.length; j++){
    var Date = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].Date;
    var NoOfRoomsAvailable = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].NoOfRoomsAvailable;
    newArr.push({ChargeTypeId,Date,NoOfRoomsAvailable});
};

【讨论】:

    【解决方案2】:

    push 只是将一个值添加到(平面)数组的末尾。将多个参数传递给push 不会在数组中引入额外的级别。同样,数组索引是纯数字和顺序的,从 0 开始。如果您有自定义的稀疏 ID(在您的情况下也是字符串),则不能将它们用作索引来检索/存储数组中的值。

    请尝试以下方法:

    var newArr = [];
    
    for(var j = 0; j < ChargeTypes.ChargeType.length; j++){
        var chargeType = ChargeTypes.ChargeType[j];
        var chargeAttribute = chargeType.Charge[0]['@attributes'];
        var chargeDetails = {
            ChargeTypeId : chargeType.ChargeTypeId,
            Date : chargeAttribute.Date,
            NoOfRoomsAvailable : chargeAttribute.NoOfRoomsAvailable
        };
    
        newArr.push(chargeDetails);
    };
    

    您在此处的结果将与此类似,这是典型的类似 JSON 的结构:

    [
        {
            ChargeTypeId : "1",
            Date : "2017-12-28",
            NoOfRoomsAvailable : "0"
        },
        {
            ChargeTypeId : "23",
            Date : "2017-12-28",
            NoOfRoomsAvailable : "3"
        }
    ]
    

    【讨论】:

      【解决方案3】:

      这应该可以工作

      var newArr = [];
      for(var j=0; j < ChargeTypes.ChargeType.length; j++){
          var ChargeTypeId = ChargeTypes.ChargeType[j].ChargeTypeId;
          var Date = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].Date;
          var NoOfRoomsAvailable = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].NoOfRoomsAvailable;
          newArr[parseInt(ChargeTypeId)] = {
              "Date": Date,
              "NoOfRoomsAvailable": NoOfRoomsAvailable 
          };
      };
      

      【讨论】:

      • 我需要 ChargeTypeId 作为数组项的键(1 或 23):)
      • 我得到这个:[null,{"Date":"2017-12-28","NoOfRoomsAvailable":"0"},null,null,null,null,null,null ,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{"日期":"2017-12-28","NoOfRoomsAvailable":"3 "}]
      • 如果您将数组推送到特定索引,则元素之间的元素将未定义/为空。
      • 如果你愿意,你可以采用这样的结构 { "1": { Date : "2017-12-28", NoOfRoomsAvailable : "0" }, "23": { Date : "2017- 12-28", NoOfRoomsAvailable : "3" } }
      • Javascript 中的数组不能以这种方式工作。 JS 不支持关联数组,你必须在 JS 中处理对象。请参阅下面的 nbrooks 或我的回答。
      【解决方案4】:

      您只需要创建new arrayChargeTypeId 即可允许推送。因为目前newArr[ChargeTypeId] 没有找到所以它给你错误。推送前添加newArr[ChargeTypeId] = [];

      试试这个:

      var newArr = [];
      for(var j=0; j < ChargeTypes.ChargeType.length; j++){
          var ChargeTypeId = ChargeTypes.ChargeType[j].ChargeTypeId;
          var Date = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].Date;
          var NoOfRoomsAvailable = ChargeTypes.ChargeType[j].Charge[0]['@attributes'].NoOfRoomsAvailable;
          newArr[ChargeTypeId] = [];
          newArr.push({ChargeTypeId},{Date});
          newArr.push({ChargeTypeId},{NoOfRoomsAvailable});
      };
      alert( JSON.stringify(newArr) );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 1970-01-01
        • 2015-10-24
        • 1970-01-01
        • 2012-04-25
        • 2019-12-29
        相关资源
        最近更新 更多