0
const users = [
  { 'user': 'fred' },
  { 'user': 'barney', 'age': 36 },
  { 'user': 'fred',   'age': 40 },
  { 'user': 'barney', 'age': 34 },
  { 'user': 'arney', 'age': 36 },
  { 'user': 'ared' },
];

---------------Expected output-----------

const sortedArray = [ {age: 34, user: "barney"}, 
                      {age: 36, user: "arney"},
                      {age: 36, user: "barney"},
                      {age: 40, user: "fred"},
                      {user: "ared"},
                      {user: "fred"},
                     ];
    
  • It should sort by age!
  • If age is equal then sort on the basis of the user key.
  • If the age key is not available it should insert those objects at last.
Shubham
  • 13
  • 1

2 Answers2

2

You could take a default value of Number.MAX_VALUE for calculating the delta of age.

const users = [{ user: 'fred' }, { user: 'barney', age: 36 }, { user: 'fred', age: 40 }, { user: 'barney', age: 34 }, { user: 'arney', age: 36 }, { user: 'ared' }];

users.sort((a, b) =>
    (a.age ?? Number.MAX_VALUE) - (b.age ?? Number.MAX_VALUE) ||
    a.user.localeCompare(b.user)
);

console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
0

Simple compare function would do the job. First compare by age, if equal then by user and if age is not available it will put those at last.

const users = [
  { user: 'fred' },
  { user: 'barney', age: 36 },
  { user: 'fred', age: 40 },
  { user: 'barney', age: 34 },
  { user: 'arney', age: 36 },
  { user: 'ared' },
];

const cmp = (x, y) => {
  if (x.age === y.age) {
    return x.user.localeCompare(y.user);
  }
  if (!x.age) {
    return 1;
  }
  if (!y.age) {
    return -1;
  }
  return x.age > y.age ? 1 : -1;
};
const ret = users.sort(cmp);
console.log(ret);
mr hr
  • 3,162
  • 2
  • 9
  • 19