map()函数小简介
map()函数一直都是我认为比较实用的函数之一,为什么这么说呢?
先来考虑一下,你是否碰到过以下场景:需要遍历一组对象取出每个对象的某个属性(比如id)并且用分隔符隔开
我想你一定有碰到过吧!因为我已经碰到过很多次了,这就是map()函数的一个典型的适用场景
不仅在前台,后台也是(所以后面我在java中也简单实现了这么一个方法),下面就看看吧
map()函数实例
在jQuery中,如.each()一样,.map()函数也有两种形式:一种是提供给jQuery对象用的.map(),还有一种是为普通的数组的jQuery.map()
jQuery.map()
两者适用起来都非常简单,先拿jQuery.map()来说吧,就前面我们提出的场景:比如在easyUI的datagrid中,我们需要实现改变多条记录的状态,那么势必会用checkbox勾选多条记录,并且会将这一组记录的id和需要修改的状态值传到后台。那么得到这一组记录id的过程就是jQuery.map()的一个典型应用,因为通过datagrid.datagrid(‘getSelections‘)取出的是一组普通的json数组
下面的代码实现了批量编辑员工角色:
var rows = $('#employee_table').datagrid('getSelections'); if (rows){ var empnos = $.map(rows, function(v){ return v.empno; }).join(","); employee_save_url = "test/editEmployee?empnos=" + empnos; $('#employee_dialog').dialog('open').dialog('setTitle','修改员工角色').dialog('center'); }
这只是map()函数的一个典型应用,它再官网上的定义其实是:将一个数组中的所有元素转换到另一个数组中。
好像是这样的!回顾上面的例子,就是将一个employee(json)所构成的数组转换成了一个empno(string)构成的数组。
再看看它的callback函数,在$.map()的callback函数中可以有两个参数,从jQuery1.6开始,第一个是当前遍历到的记录,而第二个则是数字索引,从0开始。
你应该注意到了,该函数的返回值,将会被映射到最终转换的数组中去。需要注意的是,这里的返回值还会有2种特殊情况:
1、null或者undefined,
用于移除该元素
2、数组,会将该数组中的元素添加到最终的结果数组中
关于这2种特殊情况再给出2个实例代码吧:
var arr = [{id:0, name:'张三', age: 10}, {id:1, name:'李四', age:12}, {id:3, name:'朱六', age:10}]; var value = $.map(arr, function(v){ return v.name == '李四' ? null : v.name;// 这里排除李四 }).join(); alert(value);// 这里的结果是“张三,朱六” value = $.map( [0,1,2], function(n){ return [ n, n + 1 ]; }).join(); alert(value);// 这里的结果是0,1,1,2,2,3
这里再补充一个小知识:
其实js里已经为array提供了map()函数,且效果与$.map(arr, function (v){})类似
不过在使用过程中我发现当return null的时候,两者的处理有区别,比如上面的例子中,排除李四,那么结果是“张三,朱六”
而对于js中的map()函数而言,返回的是“张三,,朱六”,看到了吗?其中的位子还是会被占,至于具体使用哪个就看具体的逻辑了。
.map()
这里关于jQuery,map()就说到这里了,下面是.map()函数,上面说了这个函数是提供给jQuery对象用的,具体怎么使用呢?
一个常见的需求,比如我们使用了一个对话框来提供一组checkbox,那么当选完之后需要将结果放入原界面,这个时候就需要得到所选的对象了
<div> 青菜豆腐 <input type="checkbox" value="1" name="dishes"> </div> <div> 酸辣土豆丝 <input type="checkbox" value="2" name="dishes"> </div> <div> 红烧鲫鱼 <input type="checkbox" value="3" name="dishes"> </div> <div> 辣子鸡 <input type="checkbox" value="4" name="dishes"> </div> <script> $(function(){ var ids = $(':checkbox:checked').map(function() { return this.value; }).get().join(); $('#dishes').val(ids); // 将选中的dishes保存到表单 }) </script>
其中函数的核心思想还是一样的,具体多用就会得心应手了!
map()函数的Java实现
体会到map()函数的方便了吧?在Java中也好像使用这样的方法啊,不过找遍Java API也没有提供类似的工具方法
那么就响应毛主席的号召,“自己动手,丰衣足食”吧,呵呵~
具体代码如下:
public static String map(Collection<?> c, String fieldName) { Field field = null; if (CollectionUtils.isNotEmpty(c)) { Class<?> clazz = c.iterator().next().getClass(); try { field = clazz.getDeclaredField(fieldName); field.setAccessible(true); String str = ""; for (Object object : c) { Object val = field.get(object); if(val != null){ str += "," + val.toString(); } } if(isBlank(str)){ return null; } return str.substring(1); } catch (Exception e) { System.out.println("fieldName填写有误,该成员变量不存在"); } } return null; }
不过这个方法可和jQuery的map()还是有很大差距的,这里只是简单的实现了map()最简单的功能
而无法对获取到的值进行任意的改变,若想实现也可以采用回调接口的方式来做,这里就不再给出代码了,有兴趣的朋友可以试试~