数据类型的转换在业务代码中肯定很常见,因为不同的数据结构使用不同的情况。比如数组适合下标快速检索,对象适合根据键快速检索。
举个例子:一个下拉选择框
数据结构: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]))