如何解决javascript中对象的属性名无法重复出现的问题?

挽枫 328 2022-08-29

前言

现在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]}),{});


最终拿到的结果是这样的:
image