首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象数组还是数组数组?

对象数组还是数组数组?
EN

Code Review用户
提问于 2014-02-28 02:53:14
回答 4查看 152关注 0票数 4

我构建手机应用程序,我经常在API中使用JSON。问题是有时我不知道如何格式化JSON数据。

例如,iOS UITableViewNSArray作为数据源。

代码语言:javascript
复制
{
    "contact_id": [
        "455",
        "464"
    ],
    "contact_name": [
        "Administrator",
        "Main contact"
    ]
}

对我来说,这是有意义的,因为我不需要遍历任何东西,但我被告知,依赖与头寸匹配的指数是不安全的。

我记得,当我问问题的时候,人们提醒我注意不要把记录分离成不同的数组,相反,我应该返回对象数组:

代码语言:javascript
复制
[
    {
        "contact_id": "455",
        "contact_name": "Administrator"
    },
    {
        "contact_id": "464",
        "contact_name": "Main contact"
    }
]

我想知道格式化JSON的最佳实践。

EN

回答 4

Code Review用户

回答已采纳

发布于 2014-02-28 16:02:01

是的,依赖索引是不安全的。

在第一个示例中,您完全依赖于contact_idcontact_name的索引匹配。

因此,假设您要提取单个索引的contact_idcontact_name,以获得这样的用户:

代码语言:javascript
复制
var User = { "Id": contact_id[0], "Name": contact_name[0] }; 
Log.print(User);
>> 455 Administrator

这可能现在还不错,但是想象一下,当一个元素被引入错误的索引时会发生什么呢?假设出现了一个新开发人员,并决定插入一个新用户,但是S/他并不太注意他正在介绍的地方,或者他误解了JSON应该如何格式化--结果是一个类似于JSON的

代码语言:javascript
复制
{
    "contact_id": [
        "455",
        "456",
        "464"
    ],
    "contact_name": [
        "Administrator",
        "Main contact",
        "Sub Contact"
    ]
}

在这里,新开发人员认为,contact_id可能只是顺其自然地被命令,而contact_name也应该按其角色(因为,S/他又一次将contact_name误解为一个角色列表,即使数组名为contact_name)。

因此,他在索引1处引入了新用户的id,在索引2处引入了新用户的名称,然后突然就让您调试为什么所有用户名、id等都是错误的。

,为什么是错的?

因为你永远不应该相信,无论是你自己在未来,或其他人将坚持您的任意规则,任何给定的索引对您的数组是相关联的。

这也是为什么您不应该匹配的原因,例如,对索引的角色权限。假设你有一个有序的角色列表

代码语言:javascript
复制
var roles = [
      "Admin",
      "LocalAdmin",
      "ContentManager",
      "User"
];

在您的权限脚本中,您检查user.role == roles[0],有时在将来--他不知道您编写的权限检查是这样工作的--决定添加一个新的用户"SuperAdmin",创建以下JSON

代码语言:javascript
复制
var roles = [
      "SuperAdmin",
      "Admin",
      "LocalAdmin",
      "ContentManager",
      "User"
];

根据user.role == roles[0]索引匹配的逻辑,每个管理员现在都变成了SuperAdmin,尽管他们不应该这样做。

票数 3
EN

Code Review用户

发布于 2014-02-28 04:18:43

将相关数据保存在一起。

  • 您的应用程序需要联系人列表吗?用第二种方法保持每个触点不变。合并数据以创建和传递单个联系人需要工作,而且容易出错。
  • 它需要一个联系人ID列表吗?做同样的事情,或者只返回这个列表。使用后一种方法,您可以很容易地生成一个有限的数组。走另一条路要困难得多(更多代码)。
  • 它是否需要一个下拉列表中的联系人名称,以加载一个ID的完整联系人?使用后者,因为你把一切都摆在前面。

简单地说,就是将相关数据保存在一起,因为通常将其分开要比将其合并起来容易。

票数 4
EN

Code Review用户

发布于 2014-02-28 18:24:36

第二种方法是最好的办法。

这是因为如果你想一想,你的应用程序需要的数据是“联系人列表”。如果我的面向对象( OOP )概念不是生疏的,接触就相当于一个对象。那就像new Contact()一样。一个列表相当于一个数组。因此,您需要这些联系人对象的数组。在C#中,它等同于new List<Contact>() --一个联系人列表。

另外,由于您已经知道数据是一个联系人列表,所以contact_是不必要的。

代码语言:javascript
复制
[
    {
        "id": "455",
        "name": "Administrator"
    },
    {
        "id": "464",
        "name": "Main contact"
    }
]

第一种方法的另一个问题是,当您循环遍历数据时,您将使用谁的长度作为基础?例如,您选择了contact_id作为基础:

代码语言:javascript
复制
var data = {...}
for(var i = 0; i < data.contact_id.length;i++){...}

现在,如果您决定将contact_id更改为id呢?您必须清除代码并将data.contact_id.length替换为data.id.length。或者,如果contact_id被完全取出怎么办?你会打破圈套的。然而,首先您有一个数组:

代码语言:javascript
复制
var data = [];
for(var i = 0; i < data.length;i++){...}

即使取出或重命名对象属性,也不会中断要使用的循环。您的循环只关心数组。对象将由循环中的代码处理,而不是循环本身。节省您5分钟的调试。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/43004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档