【问题标题】:Length of array appears incorrect数组长度显示不正确
【发布时间】:2016-11-17 06:47:37
【问题描述】:

我正在使用 React Native 创建一个应用程序,并希望创建一个带有部分标题的 <ListView>。我一直在关注一些描述如何做到这一点的不同帖子,但我遇到了一个奇怪的问题:

创建<ListView> 的一部分是创建两个数组:一个是Sections 的ID 数组,另一个是由Row ID 组成的数组数组。位于其顶层的两个数组应包含相同数量的元素。

我正在从 json 数据创建数组:

[
  {
    "id": 12,
    "name": "Surfhouse 1",
    "guests": [
      {
        "id": 100,
        "name": "Oliver Nicholson",
        "email": "oldo.nicho123@gmail.com",
        "age": "32"
      },
      {
        "id": 101,
        "name": "Nollie Bollie",
        "email": "noldo.nicho1234@gmail.com",
        "age": "20"
      },
      {
        "id": 102,
        "name": "Wootang",
        "email": "oldo.nicho3@gmail.com",
        "age": "57"
      }
    ]
  },
  {
    "id": 25,
    "name": "Surfhouse 2",
    "guests": [
      {
        "id": 200,
        "name": "Alycia Woot",
        "email": "aly.woot@gmail.com",
        "age": "32"
      },
      {
        "id": 201,
        "name": "Tim Jang",
        "email": "noldo.nicho@gmail.com",
        "age": "20"
      },
      {
        "id": 202,
        "name": "Hootenany Yeah",
        "email": "oldo.nicho123@gmail.com",
        "age": "57"
      }
    ]
  }
]

而这又用以下函数映射出来(其中accommodation是导入的json数据):

const formatDataForListView = accommodation => {
      const dataBlob = {};
      const sectionIDs = [];
      const rowIDs = [];

      accommodation.forEach((accom) => {
        sectionIDs.push(accom.id);
        dataBlob[accom.id] = accom.name;
        rowIDs[accom.id] = []; // initialise empty array associated with Section ID
        accom.guests.forEach((guest) => {
          rowIDs[accom.id].push(guest.id);
          dataBlob[accom.id + ':' + guest.id] = guest;
        });
      });

一切似乎都很好:我得到了预期的数组,但由于某种原因,RowIDs 数组有 length: 26,而(我相信)它应该只有 2。

rowIDs 数组的长度是怎么变成 26 的?

【问题讨论】:

    标签: javascript arrays react-native


    【解决方案1】:

    因为您在索引12 处有一个值,而在索引25 处有一个值。这使得数组的length 为 26,因为它采用最大索引并为长度加一,因为数组是从零开始的。

    如果您只需要这两个项目,则使用索引 01 而不使用备用项目,或者使用带有键的对象。

    更多深度阅读:Relationship between length and numerical properties

    【讨论】:

    • 好的,是的,明白了。谢谢。
    【解决方案2】:

    我建议 rowID 最好是对象。初始化数组的特定索引不是一个好习惯,我们有对象用于 key => value 目的。如果您初始化数组中的特定索引,它会将所有先前的索引设置为未定义,这是不好的。在纯 javascript 中使用对象的实现将如下所示 -

    var data = [
      {
        "id": 12,
        "name": "Surfhouse 1",
        "guests": [
          {
            "id": 100,
            "name": "Oliver Nicholson",
            "email": "oldo.nicho123@gmail.com",
            "age": "32"
          },
          {
            "id": 101,
            "name": "Nollie Bollie",
            "email": "noldo.nicho1234@gmail.com",
            "age": "20"
          },
          {
            "id": 102,
            "name": "Wootang",
            "email": "oldo.nicho3@gmail.com",
            "age": "57"
          }
        ]
      },
      {
        "id": 25,
        "name": "Surfhouse 2",
        "guests": [
          {
            "id": 200,
            "name": "Alycia Woot",
            "email": "aly.woot@gmail.com",
            "age": "32"
          },
          {
            "id": 201,
            "name": "Tim Jang",
            "email": "noldo.nicho@gmail.com",
            "age": "20"
          },
          {
            "id": 202,
            "name": "Hootenany Yeah",
            "email": "oldo.nicho123@gmail.com",
            "age": "57"
          }
        ]
      }
    ];
    
     var rowIDs = {};
     
     data.forEach(function(element) {
        rowIDs[element.id] = []; 
        element.guests.forEach(function(guest) {
          rowIDs[element.id].push(guest.id);
       });
     });
    console.log(rowIDs);

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多