如何按品牌分组后以组内最高值为基准实现数组升序/降序排序
实现方案
核心逻辑
- 第一步:对原数组按
brand字段分组,同步计算每个分组下number的最大值(需将字符串格式的number转为整数做数值比较) - 第二步:根据排序方向(升/降序),用分组的最大值对所有分组做整体排序
- 第三步:每个分组内部按number值做对应方向的排序,最后把所有分组的元素拼接成最终结果
完整代码
// 排序工具函数,参数1为原数组,参数2为排序方向:'asc'升序/'desc'降序 function sortByRule(arr, order = 'asc') { // 1. 分组+计算分组最大值 const groupMap = {} arr.forEach(item => { const num = parseInt(item.number) if (!groupMap[item.brand]) { groupMap[item.brand] = { maxNum: num, list: [item] } return } groupMap[item.brand].list.push(item) if (num > groupMap[item.brand].maxNum) { groupMap[item.brand].maxNum = num } }) // 2. 分组整体排序 const groupList = Object.values(groupMap) groupList.sort((a, b) => { return order === 'asc' ? a.maxNum - b.maxNum : b.maxNum - a.maxNum }) // 3. 分组内部排序+拍平 return groupList.flatMap(group => { return group.list.sort((a, b) => { const numA = parseInt(a.number) const numB = parseInt(b.number) return order === 'asc' ? numA - numB : numB - numA }) }) } // 测试用例 const original_array = [ { brand: "Ford", number: "1", }, { brand: "BMW", number: "1", }, { brand: "BMW", number: "5", }, { brand: "BMW", number: "20",}, { brand: "Toyota", number: "10",} ]; const asc_order = sortByRule(original_array, 'asc') const desc_order = sortByRule(original_array, 'desc') console.log('升序结果:', asc_order) console.log('降序结果:', desc_order)
结果验证
运行上述代码后,输出的升序、降序结果和你给出的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者braveducky
相关产品推荐
相关产品推荐

