Обрабатывать нуль с помощью машинописного текста - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующий вид:

let sortedCon = this.con.sort((a, b) => a.lastname.localeCompare(b.lastname));

Я пытаюсь заставить его обрабатывать нули и поддерживать простоту в одну строку.

Я пробовал это, но не работает:

let sortedCon = this.con.sort((a, b) => a ? a.lastname.localeCompare(b ? b.lastname : '') : 0);

Я знаю, что я близко, но не могу понять это. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Без минимального воспроизводимого примера, включающего определения типов для 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.

Ссылка на игровую площадку с кодом

В любом случае, надеюсь, это поможет; удачи!

0 голосов
/ 30 января 2020

Вы пробовали что-то подобное?

let sortedCon = this.con.sort((a, b) => a && a.lastname && a.lastname.localeCompare(b && b.lastname : '') : 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...