Treehouse

Sort an Array of Objects by Property Using sort(fn)

By on  

Believe it or not, there's more to JavaScript than the helper methods and classes they provide your JavaScript library. No, like seriously bro; these JavaScript-given methods do exist. One of those methods, sort, is provided to every Array instance via its prototype. I've used this method once or twice in the history of ever, bro, since I make every effort to ensure proper sort on the server side, but sometimes you may receive a JSON dump and need to sort on the client side.

Most people would assume that sort would take no method and simply sort the basic items within the array:

[1, 3, 9, 2].sort();
	// Returns: [1, 2, 3, 9]
	
[1, "a", function(){}, {}, 12, "c"].sort();
	// Returns: [1, 12, Object, "a", "c", function (){}]

But nay, broseph! If you provide a function expression to the sort method, you can sort objects within the array using simple logic. Let's say you have an array of objects representing persons and you want to sort them by age. Oh yes, it can be done, and quite easily:

[
	{ name: "Robin Van Persie", age: 28 },
	{ name: "Theo Walcott", age: 22 },
	{ name: "Bacary Sagna", age: 26  }
].sort(function(obj1, obj2) {
	// Ascending: first age less than the previous
	return obj1.age - obj2.age;
});
	// Returns:  
	// [
	//	  { name: "Theo Walcott", age: 22 },
	//	  { name: "Bacary Sagna", age: 26  },
	//	  { name: "Robin Van Persie", age: 28 }
	// ]
	

The anonymous function returns whether or not the first object's age is less than the second's, thus sorting the entire array in ascending order by age. Reverse the first and second arguments to sort in descending order.

So brochacho, now you know how to sort an array of objects using JavaScript. Get to it!

ydkjs-3.png

Recent Features

  • 9 More Mind-Blowing WebGL Demos

    With Firefox OS, asm.js, and the push for browser performance improvements, canvas and WebGL technologies are opening a world of possibilities.  I featured 9 Mind-Blowing Canvas Demos and then took it up a level with 9 Mind-Blowing WebGL Demos, but I want to outdo...

  • CSS vs. JS Animation: Which is Faster?

    How is it possible that JavaScript-based animation has secretly always been as fast — or faster — than CSS transitions? And, how is it possible that Adobe and Google consistently release media-rich mobile sites that rival the performance of native apps? This article serves as a point-by-point...

Incredible Demos

  • Retrieve Google Analytics Visits and PageViews with PHP

    Google Analytics is an outstanding website analytics tool that gives you way more information about your website than you probably need. Better to get more than you want than not enough, right? Anyways I check my website statistics more often than I should and...

  • jQuery Countdown Plugin

    You've probably been to sites like RapidShare and MegaUpload that allow you to download files but make you wait a specified number of seconds before giving you the download link. I've created a similar script but my script allows you to animate the CSS font-size...

Discussion

  1. Boger

    Nice read, never thought to sort objects this way. but man broseph and brochacho got me laugh to death :D

  2. champi

    Great ! how could I do this in PHP ?

  3. A little bit late, but it still may be useful… ;)

    In PHP, it is almost the same. Here is the equivalent code:

    $people = array(
      array('name' => 'Robin Van Persie', 'age' => 28),
      array('name' => 'Theo Walcott', 'age' => 22),
      array('name' => 'Bacary Sagna', 'age' => 26)
    );
    
    usort($people, function($a, $b) {
      return $a['age'] - $b['age'];
    });
    
    var_dump($people);
    

    More informations: http://php.net/manual/fr/function.usort.php

  4. Anil Gautam

    Hey I am tring your code but its not working.

  5. mauro

    hi, i have tryed to bud a sort function by attributes a lot really, and finally i find this blog, your code work for me if the attribute is a number not if it is a string, why? i have to do something in that case? really thank you

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!