全部 / 前端 / 技术 · 2020年10月15日 0

数组对象转为Map

数据类型的转换在业务代码中肯定很常见,因为不同的数据结构使用不同的情况。比如数组适合下标快速检索,对象适合根据键快速检索。

举个例子:一个下拉选择框

数据结构:arrApps

[
    {
      'appId': 'test-app',
      'name': 'test-app',
      'remarks': null,
      'roles': [
        'ADMIN',
        'DEVELOPER',
      ],
    },
    {
      'appId': 'test2-app',
      'name': 'test2-app',
      'remarks': null,
      'roles': [
        'ADMIN',
        'DEVELOPER',
      ],
    },
]

业务代码中还有一个 currentApp 供其他地方使用:

{
    'appId': 'test-app',
    'name': 'test-app',
    'remarks': null,
    'roles': [
      'ADMIN',
      'DEVELOPER',
    ],
}

每次切换下拉框的时候,需要更改 currentApp 的值。

暴力方法就是每次根据下拉框的值,循环遍历数据然后对比:

val:下拉框选择的值
for(arr){
   if(val == arr[i].name){
       currentApp = arr[i]
       break
   }
}

这样的时间复杂度为O(n),空间复杂度 O(1)。

那能不能把时间复杂度降到O(1),当然有喽!

那就是先把 arrApps 转为一个以 name 为 key 的 Map 结构 mapApps:

{
   'test-app'=>{name:'test-app',remarks:null},
   'test2-app'=>{name:'test2-app',remarks:null},
}

那检索的时候就很快啦:

val:下拉框选择的值
currentApp = mapApps.get(val)

如何转换呢?

Map 语法:

new Map([iterable])

let myMap = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
])

我们先把 arrApps 转为二维数组:

arrApps.map(item=>[item.name,item])

全部代码:

mapApps = new Map(arrApps.map(item=>[item.name,item]))