ios/android 很难处理对象数组吗?

2020-05-12 15:00:14 +08:00
 sayitagain

一直以来有个疑问,之前公司的 ios 开发要求我的接口给出的数组数据不要是对象,说处理不了,不能处理. 举例,本人 PHPer,我通常自己用的数组都是带下标转的,例如 { "100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } } 当我已知 id 是 105 的情况下我就可以直接 $array[105][title]取数据了.当我需要渲染数据的时候我就直接 foreach,数组的下标似乎对我没有任何影响. 但公司的 ios 说上面的处理不了,对数据提出以下要求,一定要下面这种常规的数组形式,而不是对象形式 [ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ] 不明白处理上有啥不同?还是有什么说法?

8344 次点击
所在节点    程序员
79 条回复
sayitagain
2020-05-13 10:05:08 +08:00
@zsdroid 哈哈对,刚入行的时候一直觉得{}/[]是同一个东西...或者说根本没在意这两,现在空值就要下意识的 (object) array()一下
sayitagain
2020-05-13 10:10:09 +08:00
@charlieputon 肯定是要什么给什么,我只是问下原因,学习下,不是要分个对错,大佬不必上来就问候.
guolaopi
2020-05-13 10:16:19 +08:00
卧槽,数组不都是 [{a},{b},{c}...] 这种的吗,
怎么看楼上好多都是 [ a:{a}, b:{b}, c:{c}...] 这种写法,这不是对象吗,为毛要用方括号。。。

令外,这玩意儿可以转成 Dictionary 吧
Jabin
2020-05-13 10:18:33 +08:00
都能处理啊, 用哪种方式只是看方便谁的问题了(其实也没那么不方便)
zhjie
2020-05-13 10:22:45 +08:00
不是,培训班这么不负责的吗?
sayitagain
2020-05-13 10:31:24 +08:00
@zhjie 说起来有点阴差阳错,我大学主要学的是 c#,J2ME,JSP 这类,毕业设计图书馆找资料,随便看了本 php,当时就卧槽!被 php 弱类型变量吸引了...然后就开始自学...然后毕业设计也用的 php...然后工作也顺理成章是入了 php 这行.
GM
2020-05-13 10:33:23 +08:00
楼主应该是从 php 等动态语言开始入门的,没接触过静态语言,所以才以为 PHP 的“关联数组”就是“数组”。

事实上,PHP 的关联数组(也就是代码里用的 array() 创建的变量 )是一个混合了数组和 HashTable 的一个数据结构,内部结构是非常复杂的,为的是 web 开发人员用起来方便,但是这个东西是 PHP 特有的,在 Java 、C 、C++、Objective-C 、Swift 等等语言是没有对应的概念的(稀疏数组勉强可以对应,但是稀疏数组依然只有 index,没有 key )。

真正的“数组”没有 key 的,只有数字下标 ( index ),内存里一个元素挨着一个元素,结构紧凑高效,也就是 [{}, {},...] 这种才叫做数组,这就带来一个问题,index 多大,就需要多大的数组,假设用楼主你这种表示法,你传了一个 ["123456": {"id": "123456", "title"}] 的这么个东西,那么如果真要按照数组来解析的话,那么就会创建一个可以容纳为 123456 元素的数组,假设每个元素占 100 个字节,那光这个数组就要占用 123456/1024/1024=11M 的内存,极其费内存,这种东西多了,你设备有多少内存都不够用的。如果服务端用的 ID 还比较大,比如 12345678,那光这个数组就占 1.15 G 内存,嗯....领导会把你按在床上打 PP 的。
sayitagain
2020-05-13 10:36:45 +08:00
@GM php 毕业前自学的,学校里学 c#,J2ME,JSP 这类,但我自认为我学的不行.或者说感觉上不适合.
lxk11153
2020-05-13 10:40:05 +08:00
@charlieputon 基本的 json 格式?楼主说的两种都可以吧,只是用 JsonObject 看是否需要顺序(如 java 的 LinkedHashMap/HashMap)

{ "100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } }
> An object is an unordered set of name/value pairs. An object begins with {left brace and ends with }right brace. Each name is followed by :colon and the name/value pairs are separated by ,comma.

[ { "id":100 "title":"xxx" }, { "id":105 "title":"sss" } ]
> An array is an ordered collection of values. An array begins with [left bracket and ends with ]right bracket. Values are separated by ,comma.
Leonard
2020-05-13 10:48:49 +08:00
key 不要变,数组就写成数组[ ]形式;同一 key 下的 value 类型不要随便变,别一会是字符串一会是对象
jeremaihloo
2020-05-13 10:50:27 +08:00
觉得 67 楼说的很棒
ccppgo
2020-05-13 10:52:34 +08:00
{"100":{"id":100,"title":"xxx"},"105":{"id":105,"title":"sss"}}

array_values() 处理一下重建一下数组索引就好了
Leonard
2020-05-13 10:52:39 +08:00
你举的例子 [ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ] 其实都没必要
直接 [ { "id":100 "title":"xxx" }, { "id":105 "title":"sss" } ]最好
xuanbg
2020-05-13 10:58:10 +08:00
{ "100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } }这种大多数情况下都不适合用来作为一个集合的数据结构。一般情况下,集合中的元素的 id 是无意义的,也没人关心它的值。这和 k/v 结构中的 key 不同,key 是约定的,是有意义的。

如果前端需要知道 100 这个 key 对应的 value,那么楼主的数据结构是合适的,如果前端只是列表显示,[{ "id":100 "title":"xxx" },{ "id":105 "title":"sss" }]这种结构才是合适的。
areless
2020-05-13 11:09:53 +08:00
前端处理上有很大不同,必须[,,,,]
ww940521
2020-05-13 12:59:26 +08:00
就算你返回一个字符串我也能把它解析出来,然后呢?
该挨揍还是得挨揍
no1xsyzy
2020-05-13 15:15:35 +08:00
@zsdroid #29 那有数据返回 {} 没数据返回 [] 的是什么?
jowan
2020-05-13 16:08:43 +08:00
在认真看完楼主的问题后,我已经猜到回复了哈哈
hbolive
2020-05-13 18:03:45 +08:00
一句话:PHP 让你方便(不得不说,直接取下标,有时候是真方便),可不是让你随便。。

PHP:我就不该让你们方便,搞得最后都得我来背锅。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/670932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX