controller返回已经排序的json数据,前端遍历时却顺序错乱

controller返回已经排序的json数据,前端遍历时却顺序错乱

  • mybatis框架返回不固定对象时,resultType需要写成 java.util.Map,对应的接受类为List>
  • 尽管sql语句里已经排序了,但是查询出来之后顺序早已乱掉。
  • 下面我通过两个方法实现了对返回结果的排序,因为这个需求是一维数组和二维数组都要排序。
  • 一个重要的地方就是不要返回map,因为返回的map无论是HashMap还是TreeMap,前端拿到之后都是无序的。

The first step

  • controller代码

  •     @RequestMapping("/address")
        @ResponseBody
            public ResponseMessage showPlaceStatisticsTable(
                @RequestBody ShowPlaceTableQueryParam showPlaceQueryParam, HttpSession session){
    
                List> maps = statisticsService.showPlaceTableQuery(showPlaceQueryParam);//调用mybatis的mapper.xml里的查询方法
                maps = MapKeyComparator(maps);对返回的list里的每一个map根据key进行排序,返回结果是一个无序的list,但是list里的map里的key是有序的。
                List> lists = mapChangeToList(maps);
                message.setData(lists);
                message.setCode(ResponseConstants.OK);
                message.setMsg("查询成功");
                return message;
            }
    
    

Second steps

  • 编写MapKeyComparator方法

  •     /**
         * 表格统计数据省份比较器
         */
        public List> MapKeyComparator(List> maps){
            Map compare = new TreeMap<>();//用来对应传入参数`maps`里的每一个key对应的数字
            compare.put("YEAR",1);
            compare.put("MONTH",1);
            compare.put("地点和时间",1);
            compare.put("合计",2);
            compare.put("TOTAL",2);
            compare.put("北京市",3);
            compare.put("天津市",4);
            compare.put("河北",5);
            compare.put("山西",6);
            compare.put("内蒙古自治区",7);
            compare.put("辽宁",8);
            compare.put("吉林",9);
            compare.put("黑龙江",10);
            compare.put("上海市",11);
            compare.put("江苏",12);
            compare.put("浙江",13);
            compare.put("安徽",14);
            compare.put("福建",15);
            compare.put("江西",16);
            compare.put("山东",17);
            compare.put("河南",18);
            compare.put("湖北",19);
            compare.put("湖南",20);
            compare.put("广东",21);
            compare.put("广西壮族自治区",22);
            compare.put("海南",23);
            compare.put("重庆市",24);
            compare.put("四川",25);
            compare.put("贵州",26);
            compare.put("云南",27);
            compare.put("西藏自治区",28);
            compare.put("陕西",29);
            compare.put("甘肃",30);
            compare.put("青海",31);
            compare.put("宁夏回族自治区",32);
            compare.put("新疆维吾尔自治区",33);
            compare.put("台湾",34);
            compare.put("香港",35);
            compare.put("澳门",36);
    
            List> stringObjectMapFirst = new ArrayList<>();
            for (int i = 0; i < maps.size(); i++) {
                Map stringObjectMap = new TreeMap(new Comparator() {
                    @Override
                    public int compare(String o1, String o2) {
                        Integer integer = compare.get(o1);
                        Integer integer1 = compare.get(o2);
                        if(null == integer){//预防获取不到key值
                            integer = 0;
                        }
                        if(null == integer1){
                            integer1 = 0;
                        }
                        return integer.compareTo(integer1);//降序排列
                    }
                });
                stringObjectMap.putAll(maps.get(i));
                stringObjectMapFirst.add(stringObjectMap);
            }
            return stringObjectMapFirst;
        }
    

Third steps

  • 需要先将List>类型转变为List类型,因为map类型传到前端永远是无序的,只有list才是有序的。所以此方法有两个功能,1.将List>类型转变为List类型,2.将list排序。//MapChangeList类里只有两个属性,一个string类型,一个object类型,会贴在最后。

  • /**
     * map转list,并排序
     */
    public List> mapChangeToList(List> maps){
        List> lists = new ArrayList<>();
        for (int i = 0; i < maps.size(); i++) {
            List mapChangeLists = new ArrayList<>();
            Map stringObjectMap = maps.get(i);
            Iterator it = stringObjectMap.keySet().iterator();
            while (it.hasNext()) {
                MapChangeList mapChangeList = new MapChangeList();
                String key = it.next().toString();
                Object o = stringObjectMap.get(key);
                mapChangeList.setKey(key);
                mapChangeList.setValue(o);
                mapChangeLists.add(mapChangeList);
            }
            lists.add(mapChangeLists);
        }
        //上方代码已完转换list,下方是对二维list进行排序
        Collections.sort(lists, new Comparator>() {
            @Override
            public int compare(List o1, List o2) {
                return o1.get(0).getValue().hashCode() - o2.get(0).getValue().hashCode();//这里是因为由于第一个方法将所有的月份或者年份都排到了下标为0的位置,所以直接比对哈希值即可了。。。。具体逻辑具体分析嘛
            }
        });
        return lists;
    }
    
  • 辅助类 MapChangeList :

  • public class MapChangeList implements Serializable{
    
        private static final long serialVersionUID = 7756822135607139301L;
    
        private String key;
        private Object value;
    
        public String getKey() {
            return key;
        }
    
        public void setKey(String key) {
            this.key = key;
        }
    
        public Object getValue() {
            return value;
        }
    
        public void setValue(Object value) {
            this.value = value;
        }
    
    }
    

你可能感兴趣的:(json,前端,mybatis)