DEV Community

Avnish
Avnish

Posted on

Sorting a JavaScript Object by Keys

Sorting a JavaScript Object by Keys

JavaScript objects are unordered collections of key-value pairs, but sometimes we need to sort the keys of an object for specific use cases (e.g., displaying them in a particular order). Since objects cannot be directly sorted, we need to extract their keys, sort those keys, and then reconstruct the object.


Example Code: Sorting an Object by Keys

const unordered = {
  'b': 'foo',
  'c': 'bar',
  'a': 'baz'
};

console.log("Unordered:", JSON.stringify(unordered));
// → '{"b":"foo","c":"bar","a":"baz"}'

// Sorting the object by keys
const ordered = Object.keys(unordered)
  .sort() // Sort the keys alphabetically
  .reduce((obj, key) => {
    obj[key] = unordered[key]; // Rebuild the object with sorted keys
    return obj;
  }, {});

console.log("Ordered:", JSON.stringify(ordered));
// → '{"a":"baz","b":"foo","c":"bar"}'
Enter fullscreen mode Exit fullscreen mode

Step-by-Step Explanation:

  1. Extract Keys:

    • Use Object.keys(unordered) to get an array of the object's keys: ['b', 'c', 'a'].
  2. Sort the Keys:

    • Call .sort() on the keys array to sort them alphabetically: ['a', 'b', 'c'].
  3. Rebuild the Object:

    • Use Array.prototype.reduce() to iterate over the sorted keys.
    • For each key, assign the corresponding value from the original object to the new object.
  4. Result:

    • The final ordered object retains the original values but with keys sorted alphabetically.

Benefits of This Approach:

  • Immutable Original Object: The original object remains unchanged.
  • Readability: The reduce() function provides a clear and concise way to rebuild the object.
  • Versatility: You can modify the sorting logic to customize the order (e.g., reverse alphabetical, case-insensitive, etc.).

Custom Sorting Logic

You can add custom sorting logic to sort() to handle different scenarios. For instance, for case-insensitive sorting:

const ordered = Object.keys(unordered)
  .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
  .reduce((obj, key) => {
    obj[key] = unordered[key];
    return obj;
  }, {});

console.log("Case-Insensitive Ordered:", JSON.stringify(ordered));
Enter fullscreen mode Exit fullscreen mode

Notes:

  • Objects in JavaScript do not maintain a guaranteed order of keys unless you explicitly sort them into a new object or work with Map instead.
  • If you need guaranteed order and efficient operations, consider using a Map, which maintains insertion order and can also be sorted.

Top comments (0)