【问题标题】:How to sort an array based on a boolean prop and a name prop?如何根据布尔道具和名称道具对数组进行排序?
【发布时间】:2016-08-16 15:32:22
【问题描述】:

我有一个如下所示的对象数组:

[
  {
    name: s1,
    isDefault: false
  },
  {
    name: s2,
    isDefault: true
  },
  {
    name: s3,
    isDefault: false
  }
]

我想对这个数组进行排序,以便将带有isDefault: true 的元素放在最前面,其余的按字母顺序跟随这个对象。

换句话说:

[
  {
    name: s2,
    isDefault: true
  },
  {
    name: s1,
    isDefault: false
  },
  {
    name: s3,
    isDefault: false
  }
]

我知道如何完成第一个条件:

objPanoramas.sort((a, b) => {
  return a.isDefault < b.isDefault
})

如何整合第二个条件?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    试试这个

    objPanoramas = [{
      name: "s1",
      isDefault: false
    },{
      name: "s1",
      isDefault: true
    }, {
      name: "s2",
      isDefault: true
    }, {
      name: "s3",
      isDefault: false
    }]
    
    
    objPanoramas.sort((a, b) => {
      if ((a.isDefault && b.isDefault) || (!a.isDefault && !b.isDefault)) {
        return a.name.localeCompare(b.name)
      }else{
        return !a.isDefault
      }
    })
    
    console.log(objPanoramas);

    【讨论】:

    • 您应该返回positive, zero or negative value from callback。由于自动类型转换,您的解决方案可以工作,但这不是最佳做法。
    • 我会根据您的建议编辑我的答案...谢谢
    • 我想出了这个:objPanoramas.sort((a, b) =&gt; { if (a.isDefault !== b.isDefault) { return a.isDefault &lt; b.isDefault } return a.name &gt; b.name }) 它和你的代码一样吗?
    • 基本上是的,但正如@yariash 建议的那样,使用适当的比较函数比较字符串
    【解决方案2】:
    objPanoramas.sort((a, b) => {
      if (a.isDefault == b.isDefault) {
        name1 = a.name;
        name2 = b.name;
        return name1<name2?-1:(name1>name2?1:0)
      }
      return a.isDefault < b.isDefault
    })
    

    【讨论】:

      【解决方案3】:

      您应该从callback of sort 返回正值、零或负:

      objPanoramas.sort((a, b) => {
           if(a.isDefault == b.isDefault) {
               return a.name.localeCompare(b.name); //in case both values are equal do alphabetical sort
           } else if(a.isDefault) {
                return 1; //else if a.isDefault is true return positive value.
           }
      })
      

      【讨论】:

        【解决方案4】:

        这正是你需要的:

        https://stackoverflow.com/a/4576720/6482090

        正如您在这篇文章中看到的,解决方案是检查您的 sort() 中的两个值。

        看看那个帖子上的例子!

        【讨论】:

          猜你喜欢
          • 2020-05-25
          • 2015-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-15
          • 1970-01-01
          • 2023-04-05
          • 2021-09-21
          相关资源
          最近更新 更多