Search code examples
javascriptarrayssorting

How to sort my array by length of its keys array in javascript?


How to sort my array by length of its keys array in javascript ?

my_array = [];
my_array['a'] = ['val1', 'val2'];
my_array['b'] = ['val1', 'val2', 'val3'];
my_array['c'] = ['val1', 'val2'];
my_array['d'] = ['val1', 'val2', 'val3'];
my_array['e'] = ['val1'];

sort my_array should result :-

my_array [
    'e' => ['val1'],
    'a' => ['val1', 'val2'],
    'c' => ['val1', 'val2'],
    'b' => ['val1', 'val2', 'val3'],
    'd' => ['val1', 'val2', 'val3']
];

Edit :- My original code is :

var rows = JSON.parse('my_json_string');
let my_array =[]; 

for( let x=0; x<rows.length; x++ )
{ 
    if( Array.isArray( my_array[ rows[x].rowName ] ) )
    {
        my_array[ rows[x].rowName ].push( rows[x].rowValue );
    }else{
        my_array[ rows[x].rowName ] = [ rows[x].rowValue ]; 
    }
} 

Solution

    1. You do not have a "valid" array - you likely want an object
    2. Only recently can you control the order of an object - here I use Object.fromEnttries to put the entries back in the sorted order but only if the keys are consistently alphabetic

    let my_object = {};
    my_object['a'] = ['val1', 'val2'];
    my_object['b'] = ['val1', 'val2', 'val3'];
    my_object['c'] = ['val1', 'val2'];
    my_object['d'] = ['val1', 'val2', 'val3'];
    my_object['e'] = ['val1'];
    
    my_object = Object.fromEntries(
      Object.entries(my_object).sort((a,b) => a[1].length-b[1].length)
    );
    console.log(my_object);

    If there are numerical values in the key, you will need an array (or a Map):

    let my_object = {};
    my_object['a'] = ['val1', 'val2'];
    my_object['1'] = ['val1', 'val2', 'val3'];
    my_object['b'] = ['val1', 'val2', 'val3'];
    my_object['c'] = ['val1', 'val2'];
    my_object['d'] = ['val1', 'val2', 'val3'];
    my_object['e'] = ['val1'];
    my_object['2'] = [];
    
    let myObjectArray = Object.entries(my_object)
      .reduce((acc,[key,values]) => {
        acc.push({key,arr:values});
        return acc;
      },[])
      .sort((a,b) => a.arr.length-b.arr.length); // add rules to sort keys if same length
    
    console.log(myObjectArray);