首页 > 解决方案 > 自定义排序 JavaScript

问题描述

我希望自定义排序首先出现特殊字符,然后是数字,然后是大写字母和小写字母,我正在尝试使用 lodash 来实现相同的任何想法,我如何实现这一点。

输入 :

[{
    name: '1'
}, {
    name: 'A'
}, {
    name: '#'
}, {
    name: '6'
}, {
    name: 'B'
}, {
    name: 'a'
}, {
    name: '0'
}, {
    name: '3'
}];

输出 :

[
    { name: '#' },
    { name: '0' },
    { name: '1' },
    { name: '3' },
    { name: '6' },
    { name: 'A' },
    { name: 'a' },
    { name: 'B' },
   ];

   
 
<html>
<head>
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
</head>
<script>
        let input = [
                { name: '1' },
                { name: 'A' },
                { name: '#' },
                { name: '6' },
                { name: 'B' },
                { name: 'a' },
                { name: '0' },
                { name: '3' }];
                
 const customSort = (a) => _.chain(_.partition(a, i => isNaN(i.name))).flatMap(p => _.sortBy(p, 'name')).value();


</script>
         

   </html>

标签: javascriptarrayssorting

解决方案


试试这个,

x = [
    { name: '#' },
    { name: '0' },
    { name: '1' },
    { name: '3' },
    { name: '6' },
    { name: 'A' },
    { name: 'a' },
    { name: 'B' },
];

function calcSortAlg(str) {
  let num = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
      sym = ['@', '#', '$', '~', '`', '!', '%', '^', '&', '*', '(', ')', '_', '-', '=', '+', '|', '\\', '[', '{', '}', ']', '\'', '"', ';', ':', '<', '>', ',', '.'];
  return str.split('').map(x => sym.includes(x) ? 2 : num.includes(x) ? 1 : 0).reduce((a, v) => a + v, 0);
}

x.sort((a, b) => calcSortAlg(b.name) - calcSortAlg(a.name))

输出,

 [
    { name: '#' },
    { name: '0' },
    { name: '1' },
    { name: '3' },
    { name: '6' },
    { name: 'A' },
    { name: 'a' },
    { name: 'B' },
]

推荐阅读