[英]Array.prototype.sort() working on some cases and others not
我正在尝试排列一系列衣服尺寸。
我使用Array.prototype.sort()
函数定义一个大小的数组,然后按照我在数组中定义的顺序对输入数组进行排序,这适用于标准大小,如S,M和L,但不是像40这样的大小,42,44等
代码排序数组
if (inputArray['code'] == 'size'){
inputArray.sizes.sort(function(a,b) {
var sizes = ["29","30","31","32","33","34","35","36","37","38","39","40","41","42",
"44","46","48","50","52","54","56","58","60",
"NT","N-USE", "2-3","3-4","4-5","5-6","6-7","7-8","8-9","9-10","10-11","10-13","11-13",
"XXXS","XXS","XX/XS","XS","XS/S","S","S/M","M","M/L","L","L/XL","XL","XL/XX","XXL","XXXL"];
var optionValueA = a['label'];
var optionValueB = b['label'];
html += ' index position ' + optionValueA + '=' + sizes.indexOf(optionValueA) + ' ' + optionValueB + '=' + sizes.indexOf(optionValueB);
return sizes.indexOf(optionValueA)+1 - sizes.indexOf(optionValueB)+1
});
}
html += ' SIZES json= ' + JSON.stringify(inputArray.sizes);
这是标准尺寸的输出(排序好)
指数位置S = 41 M = 43指数位置M = 43 XL = 47指数位置XL = 47 XXL = 49指数位置XXL = 49 L = 45指数位置XL = 47 L = 45指数位置M = 43 L = 45 SIZES json = [{“id”:“646”,“label”:“S”,“products”:[“28535”]},{“id”:“672”,“label”:“M”,“products” :[ “28536”]},{ “ID”: “651”, “标签”: “L”, “产品”:[ “28539”]},{ “ID”: “691”, “标签”:” XL”, “产品”:[ “28537”]},{ “ID”: “640”, “标签”: “XXL”, “产品”:[ “28538”]}]
这里输出数字大小(没有很好的排序)
指数位置42 = 13 44 = 14指数位置42 = 13 46 = 15指数位置46 = 15 48 = 16指数位置42 = 13 48 = 16指数位置46 = 15 50 = 17指数位置50 = 17 54 = 19指数位置54 = 19 52 = 18指数位置50 = 17 52 = 18指数位置46 = 15 52 = 18 SIZES json = [{“id”:“687”,“label”:“44”,“产品”:[“23300 “]},{” ID “:” 650" , “标签”: “42”, “产品”:[ “23299”]},{ “ID”: “649”, “标签”: “48”,”产品 “:[” 23302 “]},{” ID “:” 643" , “标签”: “46”, “产品”:[ “23301”]},{ “ID”: “688”, “标签” : “52”, “产品”:[ “23305”]},{ “ID”: “669”, “标签”: “50”, “产品”:[ “23303”]},{ “ID”:” 684" , “标签”: “54”, “产品”:[ “23304”]}]
这里是调试时的原始数组 (排序前)
数字大小
ORIGINAL ARRAY = [{“id”:“650”,“label”:“42”,“products”:[“23299”]},{“id”:“687”,“label”:“44”,“产品 “:[” 23300 “]},{” ID “:” 643" , “标签”: “46”, “产品”:[ “23301”]},{ “ID”: “649”, “标签” : “48”, “产品”:[ “23302”]},{ “ID”: “669”, “标签”: “50”, “产品”:[ “23303”]},{ “ID”:” 684" , “标签”: “54”, “产品”:[ “23304”]},{ “ID”: “688”, “标签”: “52”, “产品”:[ “23305”]}]
标准尺寸
ORIGINAL ARRAY = [{“id”:“646”,“label”:“S”,“products”:[“28535”]},{“id”:“672”,“label”:“M”,“产品 “:[” 28536 “]},{” ID “:” 691" , “标签”: “XL”, “产品”:[ “28537”]},{ “ID”: “640”, “标签” : “XXL”, “产品”:[ “28538”]},{ “ID”: “651”, “标签”: “L”, “产品”:[ “28539”]}]
我不是很熟练的js所以mabe有人可以提前帮助谢谢
您可以使用对象作为排序顺序,并在必要时使用默认值。
订单是使用商品和递增的索引构建的。
function orderSize(a, b) { return (order[a.label] || 0) - (order[b.label] || 0); } var array1 = [{ "id": "640", "label": "XXL", "products": ["28538"] }, { "id": "646", "label": "S", "products": ["28535"] }, { "id": "672", "label": "M", "products": ["28536"] }, { "id": "651", "label": "L", "products": ["28539"] }, { "id": "691", "label": "XL", "products": ["28537"] }], array2 = [{ "id": "643", "label": "46", "products": ["23301"] }, { "id": "650", "label": "42", "products": ["23299"] }, { "id": "649", "label": "48", "products": ["23302"] }, { "id": "684", "label": "54", "products": ["23304"] }, { "id": "688", "label": "52", "products": ["23305"] }, { "id": "669", "label": "50", "products": ["23303"] }, { "id": "687", "label": "44", "products": ["23300"] }], sizes = ["29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "44", "46", "48", "50", "52", "54", "56", "58", "60", "NT", "N-USE", "2-3", "3-4", "4-5", "5-6", "6-7", "7-8", "8-9", "9-10", "10-11", "10-13", "11-13", "XXXS", "XXS", "XX/XS", "XS", "XS/S", "S", "S/M", "M", "M/L", "L", "L/XL", "XL", "XL/XX", "XXL", "XXXL"], order = {}; sizes.forEach(function (a, i) { order[a] = i + 1; }); array1.sort(orderSize); array2.sort(orderSize); console.log(array1); console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您想对混合大小进行排序,您可以直接使用一个对象,其中包含各种大小系统的映射排序值,例如
{
64: 1,
xs: 2,
68: 3,
72: 4
s: 5
76: 6
/* ... */
}
问题是您的比较功能不一致 ,特别是部分
return sizes.indexOf(optionValueA)+1 - sizes.indexOf(optionValueB)+1
// ^^ ^^
如果两个比较值相差2个或更少,并且a
应小于b
,则函数返回错误的结果( >0
而不是<=0
)。 这将导致意外的排序。
我认为你的意思
return (sizes.indexOf(optionValueA)+1) - (sizes.indexOf(optionValueB)+1)
但这是不必要的,可以简化为
return sizes.indexOf(optionValueA) - sizes.indexOf(optionValueB)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.