DLeonardi DLeonardi - 6 months ago 14
Javascript Question

Sort an array to have specific items first in the array

I've got an array as such:

[{flag: true, other: 1},
{flag: true, other: 2},
{flag: false, other: 3},
{flag: true, other: 4},
{flag: true, other: 5},
{flag: true, other: 6},
{flag: false, other: 7}]


I want to have this:

[{flag: false, other: 3},
{flag: false, other: 7},
{flag: true, other: 1},
{flag: true, other: 2},
{flag: true, other: 4},
{flag: true, other: 5},
{flag: true, other: 6}]


Basically I want that if
array[2].flag === false
(or any other value I choose) the matching element gets placed first in the array, but after previous matching elements.
The elements that do not match, remain in the same order they were in originally.

Order of appearance is important.

How to do this best in JavaScript?

Answer

This isn't actually sorting. You can just loop through the array twice and build a new array:

var result = [];
for (var i = 0; i < arr.length; i++) {
  if (arr[i].flag === false) {
    result.push(arr[i]);
  }
}
for (var i = 0; i < arr.length; i++) {
  if (!arr[i].flag === false) {
    result.push(arr[i]);
  }
}

You can also do it with two result arrays and one loop, and concatenate the results:

var result1 = [], result2 = [];
for (var i = 0; i < arr.length; i++) {
  if (arr[i].flag === false) {
    result1.push(arr[i]);
  } else {
    result2.push(arr[i]);
  }
}
var result = result1.concat(result2);