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

Posted

技术标签:

【中文标题】首先按布尔列对数组进行排序,然后按字符串列排序【英文标题】:Sort an array first by boolean column then by string column 【发布时间】:2018-06-03 21:13:21 【问题描述】:

我正在尝试按 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;
    

【问题讨论】:

javascript sort array by two fields的可能重复 【参考方案1】:

您的问题是前两个if 重叠,如果x.isFavoritetrue,则第二个if 不可达,那么第一个ifreturn

此外,您没有检查某些情况,例如 y.isFavoritetruex.isFavorite 不是。

你可以写成

if ( x.isFavorite != y.isFavorite )

   return x.isFavorite ? -1 : 1;

else

   return x.name.localeCompare( y.name );

【讨论】:

【参考方案2】:

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

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

另外,我使用+ (Boolean) 来强制转换为数字

grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));

let data = [ isFavorite:false, name:'A' ,  isFavorite:true, name:'C' ,  isFavorite:true, name:'B' ];
data.sort((a,b) => (+b.isFavorite) - (+a.isFavorite) || a.name.localeCompare(b.name));
console.log(data);

【讨论】:

很好的答案!,+1【参考方案3】:

给你:)

var arr = [
  
    isFavorite: false,
    name: 'a'
  ,
  
    isFavorite: true,
    name: 'b'
  ,
  
    isFavorite: true,
    name: 'c'
  ,
  
    isFavorite: false,
    name: 'c'
  
];

arr.sort(function (x,y) 
    if (x.isFavorite > y.isFavorite)
        return -1;
    else if(x.isFavorite == y.isFavorite)
        return x.name > y.name;
    else
        return 1;
    
);

console.log(arr);

【讨论】:

【参考方案4】:

const data = [
  isFavorite: false, name: 'b',
  isFavorite: false, name: 'f',
  isFavorite: true, name: 'c',
  isFavorite: true, name: 'a',
  isFavorite: false, name: 'd',
  isFavorite: true, name: 'g'
];

const sortedData = data.sort((a, b) => 
  if (a.isFavorite !== b.isFavorite) 
    return a.isFavorite ? -1 : 1;
   else 
    return a.name > b.name ? 1 : -1;
  
);
  
console.log(sortedData);

【讨论】:

【参考方案5】:

试试这个:

const data = [
  isFavorite: false, name: 'B', 
  isFavorite: false, name: 'A', 
  isFavorite: true, name: 'C', 
  isFavorite: true, name: 'D',
  isFavorite: true, name: 'A',
  isFavorite: false, name: 'A',
  isFavorite: false, name: 'D',
  isFavorite: true, name: 'Z',
];

const compareLoc = (a, b) => a.name.localeCompare(b.name)
const result = [...data.filter(d => d.isFavorite).sort(compareLoc),
...data.filter(d => !d.isFavorite).sort(compareLoc)];
console.log(result);

以下 sn-p 作品。

const data = [
  isFavorite: false, name: 'B', 
  isFavorite: false, name: 'A', 
  isFavorite: true, name: 'C', 
  isFavorite: true, name: 'D',
  isFavorite: true, name: 'A',
  isFavorite: false, name: 'A',
  isFavorite: false, name: 'D',
  isFavorite: true, name: 'Z',
];

data.sort(function (x, y) 
    // if both are true or false, we should compare name attributes
    if (x.isFavorite === y.isFavorite) 
        return x.name.localeCompare(y.name);
     return x.isFavorite ? -1 : 1

)
console.log(data)

【讨论】:

这几乎对我有用,奇怪的是,除了在我的下拉列表(数组)的底部之外,一切正常,我有一些项目没有像这样排序:az,a , c, f, g , w => 所以第一部分非常好,但在 Z 之后就像 10 个项目,又从“a”开始 这并不奇怪,他不对数组的末尾进行排序。您应该对条件的每个案例进行排序,而他只在 if 语句中这样做。将 if 的代码复制/粘贴到 else 中及其下方,它应该可以工作 您可以发布 sn-p 以进行澄清吗?我做了我认为你的意思,但没有用 我没有得到确切的意思,你不需要 isFavorite(a-z) 然后 !isFavorite(a-z) 吗?为什么 a-z 出现在 a-z 之后是我在所有情况下都将 isFavorite = true 排序在 false 之前 你能检查一下我刚才分享的上面的sn-p吗

以上是关于首先按布尔列对数组进行排序,然后按字符串列排序的主要内容,如果未能解决你的问题,请参考以下文章

Bash:按前 4 列对 csv 文件进行排序

按字符串列的长度对数据帧进行排序[重复]

按字符和日期列对数据框进行排序

首先按频率对字符串中的字符进行排序,然后按字母顺序排序

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、布尔值)

如何按列对多维数组进行排序?