Как отсортировать массив обьектов?

Есть массив объектов :

a = [
  {
    name: '2107',
    id: '1',
    sup: undefined,

  },
  {
    name: '2',
    id: '2',
    sup: {
      name: "name1"
    }
  },
  {
    name: '21',
    id: '3',
    sup: {
      name: "name2"
    }
  }
]

Как отсортировать, так чтобы сначала были элементы, где sup не undefined, а потом уже равны undefined. Т.е. вот так:

а = [
  {
    name: '2',
    id: '2',
    sup: {
      name: "name1"
    }
  },
  {
    name: '21',
    id: '3',
    sup: {
      name: "name2"
    }
  },
  {
    name: '2107',
    id: '1',
    sup: undefined,

  }
]

Пробовал вот так(не работает):

function sortBy(arr) {
  return arr.sort((a, b) => a.sup != undefined ? 1 : -1);
}

sortBy(totalArr);

Ответы (2 шт):

Автор решения: DenDy

Сначалa сортируются ключи или ID, Затем создается новый массив согласно упорядоченности ключей.

Ниже пример сортировки по полю ID

 var key = [];
    var nArray = [];
    var a = [{
            name: '2107',
            id: 3,
            sup: 'undefined'
        },
        {
            name: '2107',
            id: 5,
            sup: 'undefined'
        },
        {name: '2107',
            id: 1,
            sup: 'undefined'
        },
    ];

    a.forEach(function (item) {
        key.push(item.id);
    });

    key.sort();

    key.forEach(function (key) {
        a.forEach(function (item) {
            if (item.id == key) {
                nArray.push(item);
            }
        });
    });
    
    console.info(nArray);
→ Ссылка
Автор решения: InDevX

let obj = [{
    name: '2107',
    id: '1',
    sup: undefined,
  },{
    name: '2',
    id: '2',
    sup: {name:"name1"}
  },{  name: '21',
     id: '3',
     sup: {name:"name2"}
  }
];

Array.prototype.sortByField = function(field) {
  return this.slice(0).sort(function(a,b) {
    return (a[field] !== undefined) ? -1 : 1;
  });
}

console.log(obj.sortByField('sup'));

→ Ссылка