处理一个集合中的数据以父子形式展现
2017-05-14 15:05
323 查看
1大家在开发的时候,前端处理父子处理存在级联关系的下拉框,或者展示数据时以父子形式展示,如果级联的数据比较多,处理起来效率不高,还比较麻烦,如果后端在返回list数据时,能够将父子关系处理好返回,这样前端处理起来就简单,开发效率也就高了。2所以搞了一个小工具,直接上源码,如果看不懂可以自己去检验一下就明白原理了。
//model实体
public class SysOrg implements Serializable { /** * */ private static final long serialVersionUID = 9133631499822051115L; private Long id; private Long pid; private String orgName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getOrgName() { return orgName; } public void setOrgName(String orgName) { this.orgName = orgName; } }
//构建的下拉菜单model public class DropdownItem implements Serializable { /** * */ private static final long serialVersionUID = -631110845195677461L; /** * 显示标签 */ private String label; /** * 选中值 */ private Object value; /** * 子项 */ private List<DropdownItem> children = new ArrayList<DropdownItem>(); public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public List<DropdownItem> getChildren() { return children; } public void setChildren(List<DropdownItem> children) { this.children = children; } }
/** * 下拉数据构建工具,将查询到的list转换成下拉数据的工具类,只需要传入list,设置labelField,valueField,parentField可选 * */ public class DropdownBuilder { /** * 下拉数据 */ @SuppressWarnings("rawtypes") private List list; /** * 内容字段 */ private String labelField; /** * 值字段 */ private String valueField; /** * 构建子项字段 */ private String parentField; private DropdownBuilder() {} public static DropdownBuilder create() { return new DropdownBuilder(); } @SuppressWarnings("rawtypes") public DropdownBuilder setList(List list) { this.list = list; return this; } public DropdownBuilder setLabelField(String labelField) { this.labelField = labelField; return this; } public DropdownBuilder setValueField(String valueField) { this.valueField = valueField; return this; } public DropdownBuilder setParentField(String parentField) { this.parentField = parentField; return this; } /** * 构建下拉菜单数据 * * @return */ public List<DropdownItem> build() { if (CollectionUtils.isEmpty(list)) { return Collections.emptyList(); } List<DropdownItem> rtnList = new ArrayList<DropdownItem>(); try { Map<String, DropdownItem> map = new HashMap<String, DropdownItem>(); for (Object obj : list) { String label = BeanUtils.getProperty(obj, labelField);//根据定义的lableFiled(比如id)取sysorg对象中id值作为DropdownItem中的labe if (StringUtils.isEmpty(label)) { //ExceptionUtils.wrapBusiException("{}标签值不能为空", labelField); } String value = BeanUtils.getProperty(obj, valueField);//取orgName属性值作为DropdownItem中的value值 if (StringUtils.isEmpty(value)) { //ExceptionUtils.wrapBusiException("{}值不能为空", valueField); } String parent = null; if (StringUtils.isNotEmpty(parentField)) { parent = BeanUtils.getProperty(obj, parentField); } DropdownItem item = new DropdownItem(); item.setLabel(label); item.setValue(value); map.put(value, item); if (StringUtils.isNotEmpty(parent)) { DropdownItem parentItem = map.get(parent); if (parentItem != null) { parentItem.getChildren().add(item); } else { rtnList.add(item); } } else { rtnList.add(item); } } } catch (Exception e) { //ExceptionUtils.marshException(ICommonResponse.FAIL_CODE, "获取下拉属性错误", e); } return rtnList; } }
public static void main(String[] args) {List<SysOrg> list = new ArrayList<SysOrg>();SysOrg org1 = new SysOrg();org1.setId(1L);org1.setOrgName("测试1");org1.setPid(0L);list.add(org1);SysOrg org2 = new SysOrg();org2.setId(2L);org2.setOrgName("测试2");org2.setPid(1L);list.add(org2);SysOrg org3 = new SysOrg();org3.setId(3L);org3.setOrgName("测试3");org3.setPid(0L);list.add(org3);SysOrg org4 = new SysOrg();org4.setId(4L);org4.setOrgName("测试4");org4.setPid(2L);list.add(org4);List<DropdownItem> ddl = DropdownBuilder.create().setList(list).setLabelField("orgName").setValueField("id").setParentField(" pid").build();System.out.print(JSON.toJSONString(ddl, true));}3测试结果4看结果是不是很清晰明了,可以自己测试一下,原理其就明白了了
相关文章推荐
- 在数据库查询语句中 要返回 一个集合的数据 的处理方式。
- Oracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- 更新数据库所有表的某一个指定字段 ,附加对‘将 varchar 值转换为数据类型为 int 的列时发生语法错误’处理方法
- 一个java处理JSON格式数据的通用类(封装了一个class)
- 隐藏DataGridView的数据行时一个异常的处理
- 一个数据集合的源代码
- 折线图中,时间单位是天时,同一天的两条数据,在时间轴上展现为两个点,而不是一个点
- 一个java处理JSON格式数据的通用类
- asp.net(C#)处理数据一个通用类,包括存储过程,适用于初学者[转]
- 8 关于数据仓库维度数据处理的方法探究系列——父子维
- 建一个通用的处理数据的类
- C#16位MD5加密算法的一个错误测试数据处理
- C#16位MD5加密算法的一个错误测试数据处理
- FileHelper 一个极好的数据文本文件处理类库
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- 一个jdbc的例子(包含sql语句的批处理,事务处理,数据绑定prepare,)
- Xaml中如何对ComboBox绑定一个数据集合
- 一个java处理JSON格式数据的通用类(封装了一个class)
- 8 关于数据仓库维度数据处理的方法探究系列——父子维