Javascript 使用localecompare类型脚本处理null

Javascript 使用localecompare类型脚本处理null,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我有以下几种: 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); 我知道我很接近,但我想不出来。任何帮助都将不胜感激。

我有以下几种:

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);

我知道我很接近,但我想不出来。任何帮助都将不胜感激。

您尝试过类似的方法吗

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

如果没有最小的可复制示例,包括
this.con
的类型定义以及您希望看到的特定排序顺序(如果未定义
this.con
的元素,它是否应该在相同的位置排序,就像它是用空的
lastname
或其他地方定义的一样?),很难确定,但假设是这样的:

declare const con: Array<{
    lastname?: string | null
} | null | undefined>;
a?.lastname
中的可选链接类似于
(a!=null?a.lastname:undefined)
,以及空合并
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.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"}]
两者都产生相同的顺序,其中“空”元素被移动到前面,并按数组的原始顺序移动(您不能指望是,但通常是),其余元素按
lastname
属性的顺序排序


无论如何,希望这有帮助;祝你好运

如果
a.lastname
为空怎么办?另外,我不确定所有这些都是有效的语法(
(b&&b.lastname:“”):0
)谢谢Matheus。它最近在最后两个冒号中给了我一个typescript错误:它说:“,预期”。this.con的
类型是什么?A有助于给你最好的答案。您使用的是什么版本的TypeScript?TypeScript 3.7引入了and运算符,这将有助于缩短此代码。祝你好运看起来我有TS3.6及以下版本。工作完美jcalz,非常好!非常感谢。
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"}]
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"}]