javascript - 关于这组数据如何实现 按字母列表分类展示 不改动数据结构
问题描述
var data = [{ 'name': '涡阳', 'pinyin': 'WoYang'}, { 'name': '邳州', 'pinyin': 'PiZhou'}, { 'name': '玉溪', 'pinyin': 'YuXi'}, { 'name': '无锡', 'pinyin': 'WuXi'}, { 'name': '萍乡', 'pinyin': 'PingXiang'}];
按照字母 A B C ...列表归类 如
P-> { 'name': '萍乡', 'pinyin': 'PingXiang' }, { 'name': '邳州', 'pinyin': 'PiZhou' }
类似链接描述
怎么操作这组数据。。
我的代码,比较渣 求更优雅的写法function jsfu(data) { var obj={} data.map(function(item, index) {let codeIndex = item.pinyin.charAt(0)if (!obj[codeIndex]) { obj[codeIndex] = {item: [] }} obj[codeIndex].item.push(item) }) return obj}怎么排序,发现在页面是无序的,是js对象无序特性!
问题解答
回答1:function jsfu(data) { var map = {} , arr = [] , dest = [] for (let i = 0; i < data.length; i++) {arr.push({ code: data[i].pinyin.charAt(0), item: data[i]}) } for (let i = 0; i < arr.length; i++) {if (!map[arr[i].code]) { dest.push({code: arr[i].code,item: [arr[i].item] }) map[arr[i].code] = arr[i].code} else { for (let j = 0; j < dest.length; j++) {if (dest[j].code == arr[i].code) { dest[j].item.push(arr[i].item); break;} }} } //排序 dest.sort(function(a, b) {if (a.code > b.code) { return 1;}if (a.code < b.code) { return -1;}return 0; }) return dest}jsfu(data)
[ {'code': 'P','item': [ {'name': '邳州','pinyin': 'PiZhou' }, {'name': '萍乡','pinyin': 'PingXiang' }] }, {'code': 'W','item': [ {'name': '涡阳','pinyin': 'WoYang' }, {'name': '无锡','pinyin': 'WuXi' }] }, {'code': 'Y','item': [ {'name': '玉溪','pinyin': 'YuXi' }] }]回答2:
data = data.sort(function(a, b) { return a.pinyin[0].localeCompare(b.pinyin[0])})console.log(JSON.stringify(data))
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题3. MYSQL新建用户设置可以远程访问的问题4. mysql多表联合查询优化的问题5. 数据库设计 - MySQL数据库主键问题6. MySQL中的enum类型有什么优点?7. linux - 为什么我在mysql的my.cnf下找不到bind-address?8. node.js - 我想让最后进入数据库的数据,在前台最先展示,如何做到?9. mysql字符串排序问题10. mysql 5.7单表300万数据,性能严重下降,如何破?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)