【问题标题】:Sort an array first by boolean column then by string column首先按布尔列对数组进行排序,然后按字符串列排序
【发布时间】:2023-03-25 00:25:01
【问题描述】:

我正在尝试按 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 arrays angular sorting typescript


【解决方案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吗
        猜你喜欢
        • 1970-01-01
        • 2021-12-28
        • 2023-03-05
        • 2014-01-10
        • 2013-06-29
        • 1970-01-01
        • 2011-02-17
        • 2018-05-30
        • 1970-01-01
        相关资源
        最近更新 更多