Lodash 对象排序异常求助:按price属性排序未达预期
排查Lodash按Price排序不符合预期的问题
嘿,我来帮你梳理下可能导致这个问题的几个常见原因,每个都配了例子和解决办法,你可以对照自己的代码看看:
1. 排序方向搞反了
Lodash的_.sortBy默认是升序排序(从小到大),如果直接用它按price排序,价格最低的会排在最前面,自然Apple不会在首位。要实现降序(从高到低),推荐用_.orderBy并指定排序方向:
// 错误写法:升序排序,低价在前 const sortedItems = _.sortBy(products, 'price'); // 正确写法:降序排序,高价在前 const sortedItems = _.orderBy(products, 'price', 'desc');
也可以先用_.sortBy升序排,再用_.reverse反转数组,但_.orderBy更直接清晰。
2. Price属性是字符串类型而非数字
如果你的price字段存的是字符串(比如从后端接口返回的未转换数据),Lodash会按字典序排序,这和数字大小排序逻辑完全不同。比如字符串"100"会被认为比"99"小(因为第一个字符'1'的ASCII码比'9'小):
// 有问题的数据:price是字符串 const products = [ { name: 'Apple', price: '100' }, { name: 'Banana', price: '99' } ]; // 错误排序:按字符串字典序,Banana会排在Apple前面 const wrongSorted = _.orderBy(products, 'price', 'desc'); // 解决办法:把price转成数字再排序 const correctSorted = _.orderBy(products, item => Number(item.price), 'desc');
3. Apple的Price并非实际最大值
先仔细检查你的数据源:Apple的price是不是真的比其他所有项都高?有没有可能它的price是undefined、null或者NaN?Lodash在排序时会把这些特殊值排在数字的后面(降序场景下),如果Apple的price是这类值,自然不会出现在首位。
比如:
const products = [ { name: 'Apple', price: undefined }, { name: 'Banana', price: 99 } ]; // 降序排序后,Banana会在Apple前面 const sorted = _.orderBy(products, 'price', 'desc');
4. 误用了排序方法或比较函数
如果你用的是_.sort(基于原生JS的Array.sort),需要自己编写正确的比较函数。如果比较函数写反了,也会导致排序方向错误:
// 错误写法:升序比较(a.price - b.price),低价在前 const wrongSorted = _.sort(products, (a, b) => a.price - b.price); // 正确写法:降序比较(b.price - a.price),高价在前 const correctSorted = _.sort(products, (a, b) => b.price - a.price);
你可以按照这几个方向逐一排查,应该能找到问题所在!
内容的提问来源于stack exchange,提问作者Petras Vilkelis
相关产品推荐
相关产品推荐

