您的位置:首页 > Web前端 > JavaScript

js实现汉字中文排序的方法 例如:省市列表的排序

2018-11-20 16:02 477 查看

js实现汉字中文排序的方法 例如:省市列表的排序

原文地址: http://www.cnblogs.com/weblff/p/9051608.html#undefined

localeCompare() 

  1.数组内的元素是中文字符串的简单排序

[code]var arr = ['南京', '北京', '上海', '杭州', '深圳'];
function sortChinese (arr) { // 参数: 排序的数组
arr.sort(function (item1, item2) {
return item1.localeCompare(item2, 'zh-CN');
})
}
sortChinese(arr)
console.log(arr); //  ["北京", "杭州", "南京", "上海", "深圳"]

  2.数组内的元素是对象,以对象某一个属性进行排序

[code]var arr = [
{name: '南京', code: '09', info: {province: '江苏'}},
{name: '北京', code: '01', info: {province: '北京'}},
{name: '上海', code: '02', info: {province: '上海'}},
{name: '深圳', code: '05', info: {province: '广东'}}
];
function sortChinese (arr, dataLeven) { // 参数:arr 排序的数组; dataLeven 数组内的需要比较的元素属性
/* 获取数组元素内需要比较的值 */
function getValue (option) { // 参数: option 数组元素
if (!dataLeven) return option
var data = option
dataLeven.split('.').filter(function (item) {
data = data[item]
})
return data + ''
}
arr.sort(function (item1, item2) {
return getValue(item1).localeCompare(getValue(item2), 'zh-CN');
})
}
sortChinese(arr, 'name') // 例如:比较的是name,传入的就是 'name'
console.log(arr);
/*[{name: '北京', code: '01', info: {province: '北京'}},
{name: '南京', code: '09', info: {province: '江苏'}},
{name: '上海', code: '02', info: {province: '上海'}},
{name: '深圳', code: '05', info: {province: '广东'}}]*/
sortChinese(arr, 'info.province') // 例如:比较的是数组元素属性info内的province属性,传入的就是 'info.province'
console.log(arr);
/* [{name: '北京', code: '01', info: {province: '北京'}},
{name: '深圳', code: '05', info: {province: '广东'}},
{name: '南京', code: '09', info: {province: '江苏'}},
{name: '上海', code: '02', info: {province: '上海'}}]*/

  3.对国内的所有省份进行排序,并且首字母相同的第一个添加首字母

 View Code

[code]function chineseLetter (arr, dataLeven) {
var letter = 'abcdefghjklmnopqrstwxyz'.split('')
var zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split('')
/* 获取数组元素比较的值 */
function getValue (option) {
if (!dataLeven) return option
var data = option
dataLeven.split('.').filter(function (item) {
data = data[item]
})
return data + ''
}
/* 进行排序 */
arr.sort(function (item1, item2) {
return getValue(item1).localeCompare(getValue(item2), 'zh-Hans-CN')
})
/* 判断需要排序的字符串是否含有中文字符 */
if (/[\u4e00-\u9fff]/.test(getValue(arr[0])) && typeof arr[0] === 'object') pySegSort(0, 0)
/* 给省列表中添加首字符 */
function pySegSort (letterIndex, zhIndex) {
var first = true // 首次是否加 字母标识
for (var i = zhIndex; i < arr.length; i++) {
var item = arr[i]
//      是否有值 && 当前值大于等于本次字母的最小值 && (最后一位 || 当前值小于下次字母的最小值)
var state = zh[letterIndex] && getValue(item).localeCompare(zh[letterIndex], 'zh') >= 0 && (letterIndex === letter.length - 1 || getValue(item).localeCompare(zh[letterIndex+1], 'zh') < 0)
if (state) { // 满足条件,同一个首字母下的:例如 A 下的所有省份
if (first) { //是否是第一次出现
item.letter = letter[letterIndex].toUpperCase()
first = false
} else {
item.letter = ''
}
} else { // 递归调用 函数,进行下次字母下的排列
letterIndex++
if (letterIndex < letter.length) {
pySegSort(letterIndex, i)
break
}
}
}
}
}
chineseLetter(provinceList, 'value')
console.log(provinceList)
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: