代码之家  ›  专栏  ›  技术社区  ›  Dawn17

如何根据对象值的长度对其进行排序

  •  2
  • Dawn17  · 技术社区  · 6 年前

    const obj = {
       '1': []
       '2': ['a', 'b'],
       '3': [],
       '4': ['c']
    }
    

    const obj = {
       '2': ['a', 'b'],
       '4': ['c']
       '1': []
       '3': [],
    }
    

    const sortable = Object.fromEntries(
        Object.entries(obj).sort(([,a],[,b]) => b.length)
    );
    

    但这让我无法确定。

    编辑

    对不起,钥匙是串的

    更详细的例子

    const obj = {
        '1.2.3': [1,2,3,4],
        'ABC12': [],
        'CAA11': [3,5],
        '4.4.1': [1,2,3],
    }
    

    const obj = {
        '1.2.3': [1,2,3,4],
        '4.4.1': [1,2,3],
        'CAA11': [3,5],
        'ABC12': [],
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Aleks    6 年前

    假设所有键都是整数

    Object.keys(obj).sort((a,b)=>a-b).reduce((acc, key)=>((acc[key]=obj[key]), acc),{});
    

    返回带有排序键的新对象

    编辑:

    Object.keys(obj).sort((a,b)=>obj[b].length - obj[a].length)
        .reduce((acc, key)=>((acc[key]=obj[key]), acc),{});
    

    const obj = {
        '1.2.3': [1,2,3,4],
        'ABC12': [],
        'CAA11': [3,5],
        '4.4.1': [1,2,3],
    }
    const res = Object.keys(obj)
                      .sort((a,b)=>obj[b].length - obj[a].length)
                      .reduce((acc, key)=>((acc[key]=obj[key]), acc),{});
    console.log(res);
        2
  •  1
  •   gurisko    6 年前

    你最需要的是:

    Object.entries(obj).sort(([, a], [, b]) => b.length - a.length);
    

    但是,上面代码的输出是一个数组,它又由对象的可枚举属性[key,value]对组成。无法在对象本身内部对对象的键进行排序。

        3
  •  0
  •   Osman Durdag    6 年前

    let obj = {
       '1.2.3': [1,2,3,4],
      'ABC12': [],
      'CAA11': [3,5],
      '4.4.1': [1,2,3],
    }
    console.log(obj);
    let entries = Object.entries(obj).sort((a,b) => { return b[1].length - a[1].length;});
    let tempObj = {};
    for(let i = 0; i < entries.length; i++){
      tempObj[entries[i][0]] = entries[i][1]; 
    }
    obj = tempObj;
    console.log(obj);