打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
javascript-用点,字母,数字对对象数组进行排序.我可以按数字排序,但是混合值很难.不知道是否可能做对

我尝试了典型的排序功能,并检查项目是否为字符串.但是我得到一个非常奇怪的输出.尝试了多种不同的方法.

 var arr = [{section: '12.2.a'},               {section: '12.2.b.iii'},               {section: '12.2.c'},               {section: '12'},               {section: '12A'},               {section: '12.3.b'},               {section: '12.3.c'},               {section: 'Q2'},               {section: 'Q32'},               {section: 'Q6'},               {section: 'Q5'}]var arr2 = arr.sort(function(a, b) {    var nums1 = a.section.split(".");    var nums2 = b.section.split(".");    for (var i = 0; i < nums1.length; i  ) {      if (nums2[i]) {        if (nums1[i] !== nums2[i]) {          if (isNaN(parseInt(nums1[i])) && isNaN(parseInt(nums2[i]))) {            return nums1[i].localeCompare(nums2[i]);          }          return parseInt(nums1[i]) - parseInt(nums2[i]);           }      } else {        return 1;      }    }    return -1;});

我应该使用localeCompare还是没有?
希望输出为:

[ {section: '12'}, {section: '12A'}, {section: '12.2.a'}, {section: '12.2.b.iii'}, {section: '12.2.c'}, {section: '12.3.b'}, {section: '12.3.c'}, {section: 'Q2'}, {section: 'Q6'}, {section: 'Q5'} {section: 'Q32'}]

非常感谢任何建议

解决方法:

您可以拆分字符串并使用sorting with map,同时将一个元素的每个元素与另一个元素的每个元素进行比较.如果两个元素都是数字,则取差值,否则返回localeCompare的结果.

奖励:按罗马数字排序.

function customSort(data, key, order) {    function isNumber(v) {        return ( v).toString() === v;    }    function isRoman(s) {        // https://stackoverflow.com/a/267405/1447675        return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(s);    }    function parseRoman(s) {        var val = { M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };        return s.toUpperCase().split('').reduce(function (r, a, i, aa) {            return val[a] < val[aa[i   1]] ? r - val[a] : r   val[a];        }, 0);    }    var sort = {            asc: function (a, b) {                var i = 0,                    l = Math.min(a.value.length, b.value.length);                while (i < l && a.value[i] === b.value[i]) {                    i  ;                }                if (i === l) {                    return a.value.length - b.value.length;                }                if (isNumber(a.value[i]) && isNumber(b.value[i])) {                    return a.value[i] - b.value[i];                }                if (isRoman(a.value[i]) && isRoman(b.value[i])) {                    return parseRoman(a.value[i]) - parseRoman(b.value[i]);                }                return a.value[i].localeCompare(b.value[i]);            },            desc: function (a, b) {                return sort.asc(b, a);            }        },        mapped = data.map(function (el, i) {            var string = el[key].replace(/\d(?=[a-z])|[a-z](?=\.)/gi, '$&. .'),                regex = /(\d )|([^0-9.] )/g,                m,                parts = [];            while ((m = regex.exec(string)) !== null) {                parts.push(m[0]);            }            return { index: i, value: parts, o: el, string: string };        });    mapped.sort(sort[order] || sort.asc);    return mapped.map(function (el) {        return data[el.index];    });}var arr = [{ section: '12.2.a' }, { section: '12.2.b.viii' }, { section: '12.2.b.xi' }, { section: '12.2.b.x' }, { section: '12.2.b.ix' }, { section: '12.2.b.vii' }, { section: '12.2.b.vi' }, { section: '12.2.b.iv' }, { section: '12.2.b.v' }, { section: '12.2.b.ii' }, { section: '12.2.b.iii' }, { section: '12.2.b.i' }, { section: '12.2.b.iii' }, { section: '12.2.c' }, { section: '12' }, { section: '12A' }, { section: '12.3.b' }, { section: '12.3.c' }, { section: 'Q2' }, { section: 'Q32' }, { section: 'Q6' }, { section: 'Q5' }, { section: 'Q.10' }, { section: 'Q.1' }, { section: 'Q.2' }];console.log('sorted array asc', customSort(arr, 'section'));console.log('sorted array desc', customSort(arr, 'section', 'desc'));console.log('original array', arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
来源:https://www.icode9.com/content-1-499701.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
js数组遍历和对象遍历
【原】小搞一下 javascript算法
JavaScript连载22-数组中其他方法以及Math对象
ECMAScript 6 扫盲
谨慎使用delete
ES6中的变量声明
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服