门店数据排序咨询:仓库优先,内部门店次之,外部门店最后
门店数据按仓库/内部/外部规则排序的代码修正
需求说明
需要对门店数据按以下规则排序:
- 优先排列仓库门店(
outlet_is_warehouse: 1) - 非仓库门店中,内部门店(
outlet_type: "Internal")排在第二层级 - 外部门店(
outlet_type: "External")排在最后
示例数据
{ 1: { outlet_id: "1", outlet_is_warehouse: 0, outlet_name: "1010 - City Square Mall", outlet_type: "External" }, 483: { outlet_id: "483", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-28)", outlet_type: "Internal" }, 542: { outlet_id: "542", outlet_is_warehouse: 0, outlet_name: "Singapore Express 010", outlet_type: "Internal" }, 482: { outlet_id: "482", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-29)", outlet_type: "Internal" } }
原排序代码
let data = { 1: { outlet_id: "1", outlet_is_warehouse: 0, outlet_name: "1010 - City Square Mall", outlet_type: "External" }, 483: { outlet_id: "483", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-28)", outlet_type: "Internal", }, 542: { outlet_id: "542", outlet_is_warehouse: 0, outlet_name: "Singapore Express 010", outlet_type: "Internal", }, 482: { outlet_id: "482", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-29)", outlet_type: "Internal", }, }; function sortingWarehouseInternalExternal(product_outlet) { let temp = Object.values(product_outlet).sort((outlet) => { if (outlet.outlet_is_warehouse == 1) return -1; else if (outlet.outlet_type.toLowerCase() == "external") return 0; else return +1; }); return temp; }; let temp = sortingWarehouseInternalExternal(data); console.log(JSON.stringify(temp));
问题分析
仓库门店排序正确,但内部门店无法排在外部门店之前。核心原因是Array.sort()的回调函数仅接收了单个参数,而正确的排序回调需要对比两个元素(a和b),通过返回差值来确定顺序。原逻辑仅针对单个元素返回固定值,无法正确对比非仓库门店的优先级。
修正方案
给每个门店分配优先级分数,通过对比分数差值实现排序:
- 仓库门店:优先级0(最高)
- 非仓库内部门店:优先级1
- 非仓库外部门店:优先级2(最低)
修正后代码(返回数组形式)
let data = { 1: { outlet_id: "1", outlet_is_warehouse: 0, outlet_name: "1010 - City Square Mall", outlet_type: "External" }, 483: { outlet_id: "483", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-28)", outlet_type: "Internal" }, 542: { outlet_id: "542", outlet_is_warehouse: 0, outlet_name: "Singapore Express 010", outlet_type: "Internal" }, 482: { outlet_id: "482", outlet_is_warehouse: 1, outlet_name: "Main Warehouse (07-29)", outlet_type: "Internal" } }; function sortingWarehouseInternalExternal(product_outlet) { return Object.values(product_outlet).sort((a, b) => { // 计算门店优先级分数 const getPriority = (outlet) => { if (outlet.outlet_is_warehouse === 1) return 0; if (outlet.outlet_type.toLowerCase() === "internal") return 1; return 2; }; return getPriority(a) - getPriority(b); }); }; let sortedData = sortingWarehouseInternalExternal(data); console.log(JSON.stringify(sortedData, null, 2));
修正后代码(返回对象形式,保留原键)
function sortAndReturnObject(product_outlet) { const sortedEntries = Object.entries(product_outlet).sort(([keyA, a], [keyB, b]) => { const getPriority = (outlet) => { if (outlet.outlet_is_warehouse === 1) return 0; if (outlet.outlet_type.toLowerCase() === "internal") return 1; return 2; }; return getPriority(a) - getPriority(b); }); return Object.fromEntries(sortedEntries); } let sortedObject = sortAndReturnObject(data); console.log(JSON.stringify(sortedObject, null, 2));
输出结果
数组形式输出:
[ { "outlet_id": "483", "outlet_is_warehouse": 1, "outlet_name": "Main Warehouse (07-28)", "outlet_type": "Internal" }, { "outlet_id": "482", "outlet_is_warehouse": 1, "outlet_name": "Main Warehouse (07-29)", "outlet_type": "Internal" }, { "outlet_id": "542", "outlet_is_warehouse": 0, "outlet_name": "Singapore Express 010", "outlet_type": "Internal" }, { "outlet_id": "1", "outlet_is_warehouse": 0, "outlet_name": "1010 - City Square Mall", "outlet_type": "External" } ]
内容的提问来源于stack exchange,提问作者aulia amirullah
相关产品推荐
相关产品推荐

