首先按布尔列然后按字符串列对数组进行排序

Pie*_*er 6 javascript arrays sorting typescript angular

我正在尝试按 2 个字段对数组进行排序。我有一个布尔值:isFavorite 和一个字符串:名称。所有为真的布尔值必须是第一项。但我希望数组是按字母顺序排列的。到目前为止,这是我的代码(尝试了多种方法):

data.sort(function (x,y) {
    if (x.isFavorite){
        return -1;
    }
    if (x.isFavorite && !y.isFavorite && (x.name < y.name)){
        return -1;
    }  else if ((x.isFavorite === y.isFavorite) && (x.name === y.name)){
        return 0;
    } else if (x.isFavorite && y.isFavorite && (x.name < y.name)){
        return -1;
    } else if (!x.isFavorite && !y.isFavorite && (x.name > y.name)){
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mih*_*nut 7

为什么这么多条件和重叠?

只需使用logical OR运算符即可按两个字段数组进行排序

另外,我使用+ (Boolean)以强制转换为Number

grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));
Run Code Online (Sandbox Code Playgroud)

grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));
Run Code Online (Sandbox Code Playgroud)


gur*_*372 0

你的问题是前两个if是重叠的,第二个if是无法到达的,如果x.isFavoritetrue那么第一个if将无法到达return

另外,您没有检查某些场景,例如y.isFavoritetruex.isFavorite不是。

你可以把它写成

if ( x.isFavorite != y.isFavorite )
{
   return x.isFavorite ? -1 : 1;
}
else
{
   return x.name.localeCompare( y.name );
}
Run Code Online (Sandbox Code Playgroud)