如何在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
相关产品推荐
相关产品推荐

