前言
现在21世纪了,github里的地球人都知道了javascript的对象是无法存储属性名一样的键值对的,那么有没有真实的业务场景是需要存属性名是一样的健值对呢?哎,你别说还真有!而且还就发生在了我身上。
业务背景
我们的易知微可视化低代码平台里有一个数据源的类型是在线编辑csv文件,用户上传csv文件,平台会解析成二维数组,展现到如下的表格当中:
key1 | key2 | key1 |
---|---|---|
value1 | value2 | value3 |
用户可以编辑表格中的内容,表格当中的第一行作为对象的key,每一列的第一行对应的是对象的key名,余下行对应的是该key对应的值,那么上面的表格映射出来的对象应该是这样的:
{key1:'value3',key2:'value2',}
这样你会发现,只要key出现重名,后者就会将前者合并掉,这样在设计层面是不合理的,针对这种情况,我们如何才能保证正确的映射关系,相同的key名后者不会覆盖前者?
那么有没有好的办法解决这个问题呢?起初我没有想到解决方案,后来看了一本名叫《你不知道的javascript-中卷》里面讲到了symbol的基础用法,突然我一下子焕然大悟,是不是可以利用这个symbol去当key?
解决方案
为了方便演示,这里不展示原始数据结构,假设对象的key以数组的方式存放到数组keys里,对象的key对应的value存放到values数组里,那么上述的会得到两个如下数组:
const keys = ['key1','key2','key1'];
const values = ['content1','content2','content3'];
// 将keys转换成symbol数组
const symbols = keys.map((d)=>Symbol(d));
// 迭代获取对象
const obj = symbols.reduce((pre,cur,i)=>({...pre,[cur]:values[i]}),{});
最终拿到的结果是这样的: