You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:38:08