js如何处理前台传递过来的Map

时间:2022-02-22 05:07:30

1.背景

实习期间,调试BUG的时候发现一个很奇怪的事,同样是Map传递到前台给js解析,为什么一个能直接使用eval 接收,另一个却不行
后台使用model.set(“data”,mapObject);
前台使用 var data=eval(“(“+’${data}’+”)”)
然后获得data[‘key’]

2.原因分析

data.put("test1","苹果");
data.put("test2","香蕉");

如果直接是Map对象放置在model的属性中,拿到${data} 为
{test1=苹果,test2=香蕉}
当然进一步处理还是可以实现通过Key 拿到Value
比如:

var data = '${data}';
data.replace("/=/g",":");
data['test1']

但是这种方法有缺陷,如果键值test1,中间有逗号,那到js就很难进行解析了,试问{te,st1=苹果,te,st2=香蕉}这样的串,js 怎么能认识呢?

3建议解决方案

我们可以在后台做一个处理,将Map 变成json字符串。然后传递到前台,实习公司也是用的第三方的类(阿里巴巴的)即可,这种工具类很多,就不再这里多说了,只是提供一个解决问题的思路。
同样是上面的例子,变成json串到前台就会是这样的。
${data}就会是:{“test1”:”苹果”,”test2”:”香蕉”},看到区别了吗?这样完全就不需要进行多余的操作了 看js 如何操作

后台
map-》 jsonString
前台
var data = eval("("+'${data}'+")")

data[‘key’] 即可获取到value