数组内元素全都是数组,展开并合并

有时候,在项目中,我们经常遇到一些无奈的数据结构,在某一有多个对象元素组成的数组当中,对象内也都有统一属性,类型为数组,然而在我们前台使用的时候,我们有需要将这些内部数组合并为同一个数组同时使用。

列举一个数据结构:

{
  "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;
        }

  返回的结果就是把最外层的中括号去掉了,再想想,似乎直接把数组当做参数传递进入函数作为形参也没什么问题!

  

原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/9999256.html