有时候,在项目中,我们经常遇到一些无奈的数据结构,在某一有多个对象元素组成的数组当中,对象内也都有统一属性,类型为数组,然而在我们前台使用的时候,我们有需要将这些内部数组合并为同一个数组同时使用。
列举一个数据结构:
{
"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;
}
返回的结果就是把最外层的中括号去掉了,再想想,似乎直接把数组当做参数传递进入函数作为形参也没什么问题!