【问题标题】:javascript sort array by multiple (mixed number and string) fields [duplicate]javascript按多个(混合数字和字符串)字段对数组进行排序[重复]
【发布时间】:2017-02-28 20:51:25
【问题描述】:

这个问题与所指出的不同,因为我想按一个字符串排序,然后是一个数字和一个字符串等。

我已经离开了

javascript sort array by multiple (number) fields

我的数据如下:

function GetStudentList(){
    var sl = [
    {
          "ClassOrder": 1,
          "LastName": "Blow",
          "FirstName": "Joe",
          "Class": "170-2"
    },
    {
          "ClassOrder": 2,
          "LastName": "Jane",
          "FirstName": "Sally",
          "Class": "170-1"
    },
    {
          "ClassOrder": 1,
          "LastName": "Belmont",
          "FirstName": "John",
          "Class": "170-1"
    }
]
return(sl);
}

然后我调用代码:

var selectedStudents = GetStudentList();
selectedStudents.sort(function(a,b){
    return a.LastName - b,LastName;
};

当我在浏览器中跟踪它时它似乎可以工作,但是一旦我离开排序功能, selectedStudents 数组就会恢复。它似乎确实有效,但仅适用于 ClassOrder 数据。然后,如果我尝试按 ClassOrder 排序,然后按 LastName 排序,则没有任何效果。

return a.ClassOrder - b.ClassOrder || a.LastName - b.LastName

【问题讨论】:

  • 你不能用-比较字符串,它只适用于数字。

标签: javascript arrays sorting


【解决方案1】:

您不应将字符串与- 进行比较。相反,请使用<> 分别进行降序或升序排序。

let sl = [
  {
    "ClassOrder": 1,
    "LastName": "Blow",
    "FirstName": "Joe",
    "Class": "170-2"
  },
  {
    "ClassOrder": 2,
    "LastName": "Jane",
    "FirstName": "Sally",
    "Class": "170-1"
  },
  {
    "ClassOrder": 1,
    "LastName": "Belmont",
    "FirstName": "John",
    "Class": "170-1"
  }
];

sl.sort((a, b) => {
  if (a.LastName > b.LastName) return 1;
  else if (a.LastName < b.LastName) return -1;
  return 0;
});

console.log(sl);

【讨论】:

  • NO!
  • 这太棒了,但为什么我的编辑器(即 Dreamweaver 和 Visual Studio 会突出显示“=>”并说这是语法错误?
  • @Bergi 你是对的;我很抱歉。
  • @Keltanis 很可能是因为 '=>' 是 ECMAScript 6 语法。 ( ) =&gt; { } 转换为 function() { }
  • 我想知道为什么要进行两次比较,而不仅仅是a.lastName.localeCompare(b.lastName)
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 2023-03-30
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多