Без минимального воспроизводимого примера, включающего определения типов для this.con
, а также конкретный порядок сортировки, который вы хотели бы видеть (если элемент this.con
не определен, он должен сортироваться в том же месте, как если бы это было определено с пустым lastname
? или где-то еще?), трудно быть уверенным, но если предположить, что это что-то вроде:
declare const con: Array<{
lastname?: string | null
} | null | undefined>;
, тогда вы можете использовать необязательную цепочку и nulli sh объединение операторов , введенных в TypeScript 3.7 для получения следующего однострочного:
con.sort((a, b) => (a?.lastname ?? "").localeCompare(b?.lastname ?? ""));
Необязательное сцепление в a?.lastname
аналогично (a != null ? a.lastname : undefined)
, а nulli sh объединяется expr ?? ""
аналогично (expr != null ? expr : "")
. Так что вместе получается что-то похожее на
con.sort((a, b) => ((a || {}).lastname || "").localeCompare((b || {}).lastname || ""));
, которое более уродливо, но должно работать в TS3.6 и ниже. Оба из них делают элементы null
, {lastname: undefined}
, {lastname: null}
и {lastname: ""}
взаимозаменяемыми с точки зрения порядка сортировки. Если вы хотите, чтобы они были отсортированы в определенном порядке по отношению друг к другу или по отношению к элементам с непустыми lastname
свойствами, то вам следует указать это в вопросе.
Давайте посмотрим как это действует:
const con: Array<{ lastname?: string | null } | null | undefined> = [
{ lastname: "" },
{ lastname: "B" },
{ lastname: null },
null,
{ lastname: "A" },
{},
{ lastname: "C" }
]
console.log(JSON.stringify(con));
// [{"lastname":""},{"lastname":"B"},{"lastname":null},null,{"lastname":"A"},{},{"lastname":"C"}]
Сортировка с кодом TS3.7:
const newCon = con.slice();
newCon.sort((a, b) => (a?.lastname ?? "").localeCompare(b?.lastname ?? ""));
console.log(JSON.stringify(newCon));
// [{"lastname":""},{"lastname":null},null,{},{"lastname":"A"},{"lastname":"B"},{"lastname":"C"}]
и с кодом TS3.6:
const newCon2 = con.slice();
newCon2.sort((a, b) => ((a || {}).lastname || "").localeCompare((b || {}).lastname || ""));
console.log(JSON.stringify(newCon2));
// [{"lastname":""},{"lastname":null},null,{},{"lastname":"A"},{"lastname":"B"},{"lastname":"C"}]
оба выхода тот же порядок, в котором «пустые» элементы перемещаются вперед и в исходном порядке из массива (вы не можете считать на Array.prototype.sort
, будучи стабильными , но обычно это так), а остальные элементы отсортированы в порядке свойства lastname
.
Ссылка на игровую площадку с кодом
В любом случае, надеюсь, это поможет; удачи!