Cor*_*rey 5 javascript arrays sorting jquery
假设我有一个如下所示的数组:
$array = ['xl', 's', '1', '10', '3', 'xs', 'm', '3T', 'xxl', 'xxs', 'one size'];
Run Code Online (Sandbox Code Playgroud)
我想对数组进行排序,如下所示:
$sortedArray = ['1', '3', '3T', '10', 'one size', 'xxs', 'xs', 's', 'm', 'xl', 'xxl'];
Run Code Online (Sandbox Code Playgroud)
我怎样才能在javascript中对这个数组进行排序?
我可以发现一个模式,以便帮助我走上正确的轨道,但我无法弄清楚排序功能。所有以数字开头的尺寸的图案都是第一个,按数字排序(但不确定“3T”如何处理)。然后我们显示“一种尺寸”,然后根据预定义的顺序对其余尺寸(XXS、XS、S、M、L、XL、XXL)进行排序。
将排序与用户定义的排序算法结合使用:我解析两者以与 Int 进行比较。我看看其中是否只有一个是数字,而不是以前的数字。如果两者都是数字,那么我看看两者是否相等。如果是这样,那么我从字符串中取出其余部分(不是 Int 的一部分)并按字母顺序比较它们。否则我比较两个整数。
如果上述情况都不是真的,那么我的订单数组中包含了糖果的大小,并且我对它的索引进行排序。如果缺少任何内容,您可以轻松添加它们。
扩展:因为大小有时会xxl
或XXL
我将它们转换为小写以便排序,因此它们可以根据需要进行排序。
扩展 2:因为2XL
要排序到数字的开头,所以我做了另一个技巧:解析为整数后,我查看字符串是否是 ORDER 数组中的一个。如果是这样,我将解析的整数设置为NaN
类似字符串。由此,对该条目进行关键字比较。
扩展3: 0的排序是错误的,我将其添加到开头(就像OP的提案一样)。
array = ['XL', 's', '1', '10', '2xl', '3', '0', 'xs', 'm', '3T', 'xxl', 'xxs', 'one size'];
const ORDER = ['one size', 'xxs', 'xs', 's', 'm', 'xl', '2xl', 'xxl'];
array.sort((a,b) => {
a = a.toLowerCase();
b = b.toLowerCase();
let nra = parseInt(a);
let nrb = parseInt(b);
if ((ORDER.indexOf(a)!=-1)) nra = NaN;
if ((ORDER.indexOf(b)!=-1)) nrb = NaN;
if (nrb===0) return 1;
if (nra&&!nrb || nra===0) return -1;
if (!nra&&nrb) return 1;
if (nra && nrb) {
if (nra==nrb) {
return (a.substr((''+nra).length)).localeCompare((a.substr((''+nra).length)));
} else {
return nra-nrb;
}
} else {
return ORDER.indexOf(a) - ORDER.indexOf(b);
}
});
console.log(array);
Run Code Online (Sandbox Code Playgroud)