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" } ] 不明白处理上有啥不同?还是有什么说法?

8202 次点击
所在节点    程序员
79 条回复
bloodspasm
2020-05-12 15:38:58 +08:00
`当我需要渲染数据的时候我就直接 foreach,数组的下标似乎对我没有任何影响`

你这个数组在 iOS 是 NSDictionary 是无顺序会发生改变的不是固定如果 { "100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } } 也有可能会返回 { "105":{ "id":105 "title":"sss" },"100":{ "id":100 "title":"xxx" }, }
如果要渲染成列表就会数据显示随机. [ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ]可以正确的保证数据的每次固定.其实作业解析还是有问题因为 app 是使用模型接受数据会很麻烦,推荐这样比较方便[ { "id":100 "title":"xxx" "key":1}, { "id":105 "title":"sss" key":2} ].
sayitagain
2020-05-12 16:19:33 +08:00
@bloodspasm
假设数据按要求返回了 [ { "id":100 "title":"xxx" "key":1}, { "id":105 "title":"sss" key":2} ].
在要求显示 id=100 的数据 title 时,iOS 是怎么处理的?
bloodspasm
2020-05-12 17:17:39 +08:00
@sayitagain { "id":100 "title":"xxx" "key":1} 看成是一个 model,如果 model.id == 100 取 model.title 就行了.如果是是要在大量数据中锁定 id=100 的话,推荐就要做数据预处理,处理成[ "0":model0, "1":model1 ]你同事这种风格用 dictionary[100]去访问.
实际情况列表比较多是[ model0, model1 ] 这种情况,相对较少的会 dictionary[key]这种方式在列表取值.因为用户点击的时候是知道点击数组的第几条的 数组取对应项就行,不用 key 去取值.
local
2020-05-12 17:39:11 +08:00
[{"100":{ "id":100, "title":"xxx" }}, {"105":{ "id":105 ,"title":"sss" } }]
local
2020-05-12 17:40:34 +08:00
@local JSON 是这样的话,没啥问题。
local
2020-05-12 17:42:38 +08:00
其实外层的 100,105 用处不大。直接返回这种格式的更好
local
2020-05-12 17:42:46 +08:00
[{ "id":100, "title":"xxx"}, { "id":105 ,"title":"sss" }
loshine1992
2020-05-12 17:45:04 +08:00
你这个其实还好,问题是我合作的 PHP,同一个 API,一下子返回对象,一下子又返回数组,你叫我怎么办,我也很无奈啊。
0DBBFF
2020-05-12 17:45:22 +08:00
],同意 7L 这种形式,但少了半拉括号
asAnotherJack
2020-05-12 17:46:17 +08:00
@local #4 这种不行吧,通常 key 应该固定,只改变 value,用 100,105 这种做 key,解析的时候只能解析成 map 了,客户端可能会发飙的
sayitagain
2020-05-12 17:46:41 +08:00
@local @bloodspasm 嗯,同事也跟我这么说,对他们基本没什么用还徒增烦恼.按对象数组 php 里的处理方式太方便了,但他们没跟我解释清楚他们的处理方式,我所以有点困惑.
0DBBFF
2020-05-12 17:48:30 +08:00
@sayitagain 原因很简单,key 是固定的好取值。
sayitagain
2020-05-12 17:49:01 +08:00
@asAnotherJack 确实发飙了哈哈,之前我这块代码一直对接的是前端和内部通信,没有什么异议.最近需要开放给 app 才提出了问题,目前通过请求来源对数据做了转换了
ysc3839
2020-05-12 17:49:49 +08:00
@bloodspasm 但是 Objective-C 没有提供有序 map 吗?印象中 C++ 和 Java 都有提供吧?用有序 map 就能解决这个问题了。
kera0a
2020-05-12 17:50:25 +08:00
上一个 phper 问这个问题时,被骂了 200 多楼。
sayitagain
2020-05-12 17:50:53 +08:00
@ysc3839 app 给我的反馈是能处理,但是麻烦,最好后端直接给出标准格式数据.
sayitagain
2020-05-12 17:52:44 +08:00
@kera0a 像用 100,105 这种无序 key 数组,在 php 里实在是太好用了,app 不给我解释我确实很难理解为啥
kera0a
2020-05-12 17:55:12 +08:00
@sayitagain 这个帖有类似讨论
https://www.v2ex.com/t/629474
HangoX
2020-05-12 17:55:48 +08:00
不难处理,但是你这个是 map,map 迭代没有数组快,js 那些是没有问题,因为本来就不区分,但是强类型语言这个区分得很开。而且 map 如果你是用 hashmap 是不保数序的,你每次还迭代还需要弄个 forint 。那么多蛋疼的事情,我又不需要 1 这个 key,我为何不直接用数组。
sayitagain
2020-05-12 18:03:09 +08:00
@kera0a 回复果然很惨烈,我倒不是要说个谁对谁错谁好谁坏,我这边一般是前端 /app 要什么样的给什么...刚好就这个接口是无序 key 返回的,就讨论了下,两 app 开发没跟我解释清楚缘由,我就来好奇问下.

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

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

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

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

© 2021 V2EX