1

I have an array which contains objects.

Those objects have a fullname property and an member-id.

While the fullname is always available the member-id can be null if he or she is a potential member but has not signed up yet.

The result should look as follows:

{ id: 1122, name: Adrianna Budzinski }
{ id: 3785, name: Amy Divine }
{ id: 1555, name: Gale Purdue }
{ id: 1920, name: Rex Feng }
{ id: 2010, name: Samella Vizcaino }
{ id: null, name: Bethanie Weaver }
{ id: null, name: Celesta Gullo }
{ id: null, name: Darrick Fort }
{ id: null, name: Edmundo Boulanger }
{ id: null, name: Freddie Lanclos }
{ id: null, name: Gregory Lickteig }
{ id: null, name: Gwendolyn Cuadra }
{ id: null, name: Krystal Brosnahan }
{ id: null, name: Lahoma Pagani }
{ id: null, name: Senaida Risk }
{ id: null, name: Valarie Lopes }

The members with an id should be at the top sorted by name and the members without should follow also sorted by name.

What I achieved so far are two separate sort functions but I do not know how to merge them.

let sortedFriends = friends.sort(function(a, b){
  if(a.name < b.name) return -1;
  if(a.name > b.name) return 1;
  return 0;
});

sortedFriends = sortedFriends.sort(function(a, b){
  if(a.id === null) return 1;
  if(b.id === null) return -1;
  if(a.id === b.id) return 0;
  if(a.id < b.id) return -1 ;
  if(a.id < b.id) return 1;
});
1
  • Just stick them in the same function, one after the other. If the result of the first portion of the function is 0, then run the second portion, else return the result. Commented Jun 9, 2016 at 11:02

3 Answers 3

2

You could use sort by groups (id or null) and by name.

var array = [{ id: null, name: 'Darrick Fort' }, { id: null, name: 'Edmundo Boulanger' }, { id: 1122, name: 'Adrianna Budzinski' }, { id: null, name: 'Freddie Lanclos' }, { id: null, name: 'Gregory Lickteig' }, { id: null, name: 'Gwendolyn Cuadra' }, { id: 2010, name: 'Samella Vizcaino' }, { id: null, name: 'Bethanie Weaver' }, { id: null, name: 'Celesta Gullo' }, { id: 3785, name: 'Amy Divine' }, { id: null, name: 'Krystal Brosnahan' }, { id: null, name: 'Lahoma Pagani' }, { id: 1920, name: 'Rex Feng' }, { id: 1555, name: 'Gale Purdue' }, { id: null, name: 'Senaida Risk' }, { id: null, name: 'Valarie Lopes' }];

array.sort(function (a, b) {
    return (a.id === null) - (b.id === null) || a.name.localeCompare(b.name);
});

console.log(array);

Sign up to request clarification or add additional context in comments.

4 Comments

I like this, but elements with an id of null have to be sorted too.
Don't like it anymore.
fulfills all my requirements in a short and pretty way.
1

You can combine them like as follows

var friends = [{  id: 1122,  name: 'Adrianna Budzinski'}, {  id: 3785,  name: 'Amy Divine'}, {  id: 1555,  name: 'Gale Purdue'}, {  id: 1920,  name: 'Rex Feng'}, {  id: 2010,  name: 'Samella Vizcaino'}, {  id: null,  name: 'Bethanie Weaver'}, {  id: null,  name: 'Celesta Gullo'}, {  id: null,  name: 'Darrick Fort'}, {  id: null,  name: 'Edmundo Boulanger'}, {  id: null,  name: 'Freddie Lanclos'}, {  id: null,  name: 'Gregory Lickteig'}, {  id: null,  name: 'Gwendolyn Cuadra'}, {  id: null,  name: 'Krystal Brosnahan'}, {  id: null,  name: 'Lahoma Pagani'}, {  id: null,  name: 'Senaida Risk'}, {  id: null,  name: 'Valarie Lopes'}];

friends.sort(function(a, b) {
  // check id values are equal even the null
  if (a.id === b.id) {
    // compare the name property in that case
    if (a.name < b.name) return -1;
    if (a.name > b.name) return 1;
    return 0;
  }
  // else check for null
  if (a.id === null) return 1;
  if (b.id === null) return -1;
  // if both are different return the difference to sort based on that
  return a.id - b.id
});

console.log(friends);


Or simplified using String#localeCompare() method

var friends = [{  id: 1122,  name: 'Adrianna Budzinski'}, {  id: 3785,  name: 'Amy Divine'}, {  id: 1555,  name: 'Gale Purdue'}, {  id: 1920,  name: 'Rex Feng'}, {  id: 2010,  name: 'Samella Vizcaino'}, {  id: null,  name: 'Bethanie Weaver'}, {  id: null,  name: 'Celesta Gullo'}, {  id: null,  name: 'Darrick Fort'}, {  id: null,  name: 'Edmundo Boulanger'}, {  id: null,  name: 'Freddie Lanclos'}, {  id: null,  name: 'Gregory Lickteig'}, {  id: null,  name: 'Gwendolyn Cuadra'}, {  id: null,  name: 'Krystal Brosnahan'}, {  id: null,  name: 'Lahoma Pagani'}, {  id: null,  name: 'Senaida Risk'}, {  id: null,  name: 'Valarie Lopes'}];

friends.sort(function(a, b) {
  // if id's are equal compare name property
  // id of a is null then return 1
  // id of b is null then return -1
  // else return the difference of them
  return (a.id == b.id && a.name.localeCompare(b.name)) || (a.id === null && 1) || (b.id === null && -1) || (a.id - b.id);
});

console.log(friends);

Comments

0

You can use an arithmetic calculation to determine position:

Logic:

  • For ID, since we just have to see availability, set it as 1 or -1 and compare.
  • Compare name and sort it accordingly and then add ID comparison value.
  • Set values based on the priority. So since all members with ID needs to be shown first, have higher value for it.

var data=[{id:1122,name:"Adrianna Budzinski"},{id:3785,name:"Amy Divine"},{id:1555,name:"Gale Purdue"},{id:1920,name:"Rex Feng"},{id:2010,name:"Samella Vizcaino"},{id:null,name:"Bethanie Weaver"},{id:null,name:"Celesta Gullo"},{id:null,name:"Darrick Fort"},{id:null,name:"Edmundo Boulanger"},{id:null,name:"Freddie Lanclos"},{id:null,name:"Gregory Lickteig"},{id:null,name:"Gwendolyn Cuadra"},{id:null,name:"Krystal Brosnahan"},{id:null,name:"Lahoma Pagani"},{id:null,name:"Senaida Risk"},{id:null,name:"Valarie Lopes"}];

data.sort(function(a,b){
  var _id1 = a.id? 1: -1;
  var _id2 = b.id? 1: -1;
  var rank = _id1 >_id2 ? -10: _id1< _id2 ? 10 : 0
  var v = a.name > b.name? 1: a.name < b.name? -1: 0;
  return rank + v;
});

document.getElementById("result").innerHTML = JSON.stringify(data,0,4)
<pre id="result"></pre>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.