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

如何在Laravel中按HSN前两位数字对数组进行排序

按HSN字段前两位数字排序JSON数组

现有如下JSON数组:

[
    {
        "id": 480,
        "HSN": 4808
    },
    {
        "id": 575,
        "HSN": 5702
    },
    {
        "id": 638,
        "HSN": 6301
    },
    {
        "id": 765,
        "HSN": 7317
    },
    {
        "id": 6626,
        "HSN": 47071000
    },
    {
        "id": 6727,
        "HSN": 48081000
    },
    {
        "id": 6728,
        "HSN": 48084010
    }
]

需要按HSN字段的前两位数字排序,得到如下结果:

[
    {
        "id": 6626,
        "HSN": 47071000
    },
    {
        "id": 480,
        "HSN": 4808
    },
    {
        "id": 6727,
        "HSN": 48081000
    },
    {
        "id": 6728,
        "HSN": 48084010
    },
    {
        "id": 575,
        "HSN": 5702
    },
    {
        "id": 638,
        "HSN": 6301
    },
    {
        "id": 765,
        "HSN": 7317
    }
]

尝试过sortBy、sort方法但未生效,求正确实现方式。


解决方案

原生JavaScript实现

利用数组sort方法,核心是提取HSN的前两位数字后做数值比较:

const data = [
    { "id": 480, "HSN": 4808 },
    { "id": 575, "HSN": 5702 },
    { "id": 638, "HSN": 6301 },
    { "id": 765, "HSN": 7317 },
    { "id": 6626, "HSN": 47071000 },
    { "id": 6727, "HSN": 48081000 },
    { "id": 6728, "HSN": 48084010 }
];

// 排序逻辑:提取HSN前两位转为数字,再比较
const sortedData = [...data].sort((a, b) => {
    const aHSNPrefix = parseInt(a.HSN.toString().slice(0, 2), 10);
    const bHSNPrefix = parseInt(b.HSN.toString().slice(0, 2), 10);
    return aHSNPrefix - bHSNPrefix;
});

console.log(sortedData);

Lodash的sortBy实现

如果使用Lodash工具库,自定义排序依据函数即可:

const _ = require('lodash');

const sortedData = _.sortBy(data, item => {
    return parseInt(item.HSN.toString().slice(0, 2), 10);
});

关键说明

  • 将HSN转为字符串,确保能稳定提取前两位(无论HSN是4位还是8位数字)
  • 转为数字后做差值比较,保证排序是数值顺序而非字符串字典序(避免"10"排在"2"前面的问题)
  • 使用[...data]创建数组副本,避免修改原数组(无需保留原数组可省略)

内容的提问来源于stack exchange,提问作者Chandan Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:35:20