有时候,在项目中,我们经常遇到一些无奈的数据结构,在某一有多个对象元素组成的数组当中,对象内也都有统一属性,类型为数组,然而在我们前台使用的时候,我们有需要将这些内部数组合并为同一个数组同时使用。
列举一个数据结构:
{ "mainDevice": [ { "id": 1100001, "deviceNo": "SDNO00001001", "additions": [{ "additionId": 20000000001, "additionType": 1, "additionNo": "ADDNO1001", "effectiveTime": 1574326205000 },{ "additionId": 20000000013, "additionType": 2, "additionNo": "ADDNO1024", "effectiveTime": 1574326205000 }] }, { "id": 1100002, "deviceNo": "SDNO00001002", "additions": [{ "additionId": 20000000002, "additionType": 2, "additionNo": "ADDNO1002", "effectiveTime": 1574326205000 }] } ] }
一辆车上可能存在多种类型的主设备,每一个主设备上又可能绑定多个不同类型的附加设备,这就导致我们获取的数据格式有可能是上述列举的格式。
然而我们在前台展示的时候,可能是所有附加设备需要放在一起展示,这就需要我们把所有附加设备全部合并到同一个数组内部,那么怎么提取出所有附加设备呢?
当然,最容易想到的方法:
let additions = mainDevice.map(item => item.additions)
这么依赖,结果必然是这么个格式: [[{}, {}], [{}]],有多少个主设备,最外层数组就会产生多少个数组元素,那么我们下一个需要做的就是:
形象点来说,就是把最外层这个中括号去掉,然后把内部的所有数组,合并。
在元素固定的情况下,我们可以一个元素一个元素的展开获取,如果所有数据个数都不确定呢?
我能够想到的唯一的方法似乎就是函数的apply方法。
apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数
那么,在函数内部,将数组合并是否可行?
function arrExpand (){ let initArr = [] Array.from(arguments).forEach(item => { initArr = initArr.concat(item) }) return initArr; }
返回的结果就是把最外层的中括号去掉了,再想想,似乎直接把数组当做参数传递进入函数作为形参也没什么问题!