如何基于不完整的基准参考数组对SKU对象数组进行自定义排序
实现方案
核心思路是预先生成尺码到排序权重的映射表,避免直接排序时的格式兼容问题,同时保证所有尺码都按预设规则排列,不受库存返回结果影响。
实现步骤
- 第一步:构建全量尺码权重映射
从基准排序参考数据中,按颜色ID取出对应的全量尺码顺序数组,将其转换为「尺码-权重」的映射对象,权重值直接用尺码在数组中的索引即可,索引越小排序优先级越高。 - 第二步:排序SKU数组
调用数组的sort方法,对比两个SKU时直接取对应尺码的权重值做差,即可得到符合要求的排序结果。如果存在基准规则外的特殊尺码,可以统一设置最大权重让其排在列表末尾。 - 第三步:标记售罄状态(可选)
排序完成后,遍历SKU数组,判断尺码是否在有库存的返回数组中,不在的话将available字段设为false即可。
代码示例(JavaScript)
示例数据
// 原始SKU数据 const skuList = [ { id: '1234567', size: 'L', available: true, color: { id: 1234 }}, { id: '1234588', size: 'XS', available: true, color: { id: 1234 }}, { id: '1234568', size: 'M', available: true, color: { id: 1234 }}, { id: '1234569', size: 'XL', available: true, color: { id: 1234 }}, { id: '1234573', size: 'S', available: true, color: { id: 1234 }} ] // 全量基准排序参考数据 const sizeRuleMap = { "1234": ["XS", "S", "M", "L", "XL", "XXL"] } // 接口返回的当前有库存尺码数组(示例为["S", "M"]) const inStockSizes = ["S", "M"]
实现代码
function sortSkuList(skuList, sizeRuleMap, inStockSizes) { if (skuList.length === 0) return [] // 取当前SKU对应的颜色ID const colorId = skuList[0].color.id.toString() // 生成权重映射 const sizeWeightMap = {} const fullSizeOrder = sizeRuleMap[colorId] || [] fullSizeOrder.forEach((size, index) => { sizeWeightMap[size] = index }) // 最大权重,用于基准外的未知尺码 const maxWeight = fullSizeOrder.length // 排序 + 标记库存状态 return skuList .sort((a, b) => { const weightA = sizeWeightMap[a.size] ?? maxWeight const weightB = sizeWeightMap[b.size] ?? maxWeight return weightA - weightB }) .map(sku => ({ ...sku, available: inStockSizes.includes(sku.size) })) }
输出结果
const result = sortSkuList(skuList, sizeRuleMap, inStockSizes) console.log(result) /* 输出: [ { id: '1234588', size: 'XS', available: false, color: { id: 1234 }}, { id: '1234573', size: 'S', available: true, color: { id: 1234 }}, { id: '1234568', size: 'M', available: true, color: { id: 1234 }}, { id: '1234567', size: 'L', available: false, color: { id: 1234 }}, { id: '1234569', size: 'XL', available: false, color: { id: 1234 }} ] */
说明
该方案不限制尺码格式,只要全量基准规则中存在对应的尺码名称,就可以按预设顺序排列,兼容字母、数字、文字、混合格式的尺码。如果存在多颜色的SKU混合的情况,可以在排序时先按颜色ID分组,每组分别按对应颜色的尺码规则排序后再合并即可。
内容的提问来源于stack exchange,提问作者dsp_099
相关产品推荐
相关产品推荐

