如何在JavaScript中按子数组长度对带自定义键的数组排序?
如何在JavaScript中按子数组长度对带自定义键的数组排序?
首先得给你提个小误区:你现在用JavaScript数组来存带自定义字符串键的元素其实不太合适哦~数组本质是为数字索引的有序集合设计的,你加的这些自定义键(比如'a'、'b')其实会变成数组的属性,并不会被数组的sort这类方法处理,这也是直接用数组排序没效果的核心原因。
修正方案步骤
1. 用普通对象替代数组存储键值对
先把你原始代码里的my_array改成普通对象,这是存储自定义键值对的正确姿势:
var rows = JSON.parse('my_json_string'); let myObj = {}; // 替换数组为普通对象 for( let x = 0; x < rows.length; x++ ) { const rowName = rows[x].rowName; const rowValue = rows[x].rowValue; if( Array.isArray( myObj[rowName] ) ) { myObj[rowName].push(rowValue); } else { myObj[rowName] = [rowValue]; } }
2. 提取键值对并按子数组长度排序
利用Object.entries()把对象转成[[键, 子数组], [键, 子数组], ...]格式的数组,再用sort()方法按子数组长度升序排列:
// 提取对象的键值对数组,然后按子数组长度升序排序 const sortedEntries = Object.entries(myObj).sort((a, b) => { // a[1]和b[1]是对应的子数组,用长度差实现升序 return a[1].length - b[1].length; });
3. 转换为你需要的结构
如果你想要得到类似预期的有序结构,可以按需转换:
- 若要保持严格顺序且方便遍历,推荐用
Map(ES6+支持,会严格保留插入顺序):const sortedMap = new Map(sortedEntries); // 遍历示例 sortedMap.forEach((subArray, key) => { console.log(`${key} =>`, subArray); }); - 若要模拟你预期的“带键的数组”形式(注意:数组仍不适合存自定义键,仅为贴合你的需求):
const sortedArray = []; sortedEntries.forEach(([key, subArray]) => { sortedArray[key] = subArray; }); // 此时sortedArray的属性顺序就符合你的预期
最终效果验证
执行完上述代码后,你会得到完全符合预期的排序结果:
'e' => ['val1'], 'a' => ['val1', 'val2'], 'c' => ['val1', 'val2'], 'b' => ['val1', 'val2', 'val3'], 'd' => ['val1', 'val2', 'val3']
备注:内容来源于stack exchange,提问作者al-dr
相关产品推荐
相关产品推荐

