除了 Lodash,还有许多 JavaScript 库可以实现对象数组按属性值长度排序,这些库要么专注于数据处理,要么是功能更全面的工具库。以下是一些常用的选择:
1. Underscore.js
Underscore 是与 Lodash 类似的工具库,API 设计相似,也提供了排序方法:
const _ = require('underscore');
const items = [
{ id: 1, name: 'apple' },
{ id: 2, name: 'banana' },
{ id: 3, name: 'cat' }
];
// 按 name 长度升序排序
const sorted = _.sortBy(items, item => item.name.length);
2. Ramda
Ramda 是一个函数式编程库,强调纯函数和不可变性,排序方式更偏向函数式风格:
const R = require('ramda');
const items = [
{ id: 1, name: 'apple' },
{ id: 2, name: 'banana' },
{ id: 3, name: 'cat' }
];
// 按 name 长度升序排序
const sorted = R.sortBy(R.compose(R.length, R.prop('name')))(items);
// 按 name 长度降序排序(需配合 reverse)
const sortedDesc = R.reverse(R.sortBy(R.compose(R.length, R.prop('name')))(items));
3. Lodash-es(Lodash 的 ES 模块版本)
如果你在现代 ES 模块项目中使用,可以选择 Lodash 的 ES 模块版本,用法与 Lodash 一致但支持树摇:
import { sortBy } from 'lodash-es';
const items = [/* ... */];
const sorted = sortBy(items, item => item.name.length);
4. date-fns(附带数组工具)
虽然主要用于日期处理,但 date-fns 也包含一些数组工具函数,可结合原生方法使用:
import { sortBy } from 'date-fns';
const items = [/* ... */];
// 按 name 长度升序排序
const sorted = sortBy(items, (item) => item.name.length);
5. 原生 JavaScript(无需库)
实际上,无需任何库也能高效实现,原生 Array.sort()
性能甚至可能更优:
const items = [/* ... */];
// 升序(短 -> 长)
const sortedAsc = [...items].sort((a, b) => a.name.length - b.name.length);
// 降序(长 -> 短)
const sortedDesc = [...items].sort((a, b) => b.name.length - a.name.length);
各库对比与选择建议
库 | 特点 | 适用场景 |
Underscore.js | API 简单,与 Lodash 相似 | 项目已引入或需要轻量工具库 |
Ramda | 函数式风格,适合函数式编程项目 | 强调纯函数、不可变性的场景 |
Lodash-es | 支持 ES 模块,可树摇优化体积 | 现代前端项目(Webpack/Vite 等) |
date-fns | 主要处理日期,数组工具是附加功能 | 已使用 date-fns 处理日期的项目 |
原生 JavaScript | 无依赖,性能优 | 追求轻量、无需额外库的场景 |
如果项目中已经引入了上述某个库,直接使用对应库的排序方法即可;如果是新项目且仅需排序功能,原生 Array.sort()
是最轻便高效的选择。