You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

门店数据排序咨询:仓库优先,内部门店次之,外部门店最后

门店数据按仓库/内部/外部规则排序的代码修正

需求说明

需要对门店数据按以下规则排序:

  • 优先排列仓库门店(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:06:24