如何在JavaScript中对对象数组进行排序( 二 )

如果要让上面的顺序相反,可以这么做:
function compare(a, b) {  ...  // 乘以-1来反转返回值  return comparison * -1;}创建一个动态排序函数最后,排序函数更具动态性 。
我们创建一个排序函数,可以使用该函数对一组对象进行排序,这些对象的值可以是字符串或数字 。该函数有两个参数-我们要排序的键和返回结果的顺序(即升序或降序):
const singers = [  { name: 'Steven Tyler', band: 'Aerosmith', born: 1948 },  { name: 'Karen Carpenter', band: 'The Carpenters', born: 1950 },  { name: 'Kurt Cobain', band: 'Nirvana', born: 1967 },  { name: 'Stevie Nicks', band: 'Fleetwood Mac', born: 1948 },];function compareValues(key, order = 'asc') {  return function innerSort(a, b) {    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {      // 该属性在任何一个对象上都不存在      return 0;    }    const varA = (typeof a[key] === 'string')      ? a[key].toUpperCase() : a[key];    const varB = (typeof b[key] === 'string')      ? b[key].toUpperCase() : b[key];    let comparison = 0;    if (varA > varB) {      comparison = 1;    } else if (varA < varB) {      comparison = -1;    }    return (      (order === 'desc') ? (comparison * -1) : comparison    );  };}使用:
//数组按`band`排序,默认为升序singers.sort(compareValues('band'));// 数组按 `band` 降序排序singers.sort(compareValues('band', 'desc'));// 数组按 `name` 升序排序singers.sort(compareValues('name'));// 数 组born 降序排序singers.sort(compareValues('born', 'desc'));在上面的代码中,hasOwnProperty方法用于检查指定的属性是否在每个对象上定义,且没有通过原型链继承 。如果没有在两个对象上定义,函数返回0,排序顺序保持不变(即对象之间保持不变) 。
typeof运算符还用于检查属性值的数据类型,这使函数可以确定对数组进行排序的正确方法 。如果指定属性的值是一个字符串,则使用toUpperCase方法将其所有字符都转换为大写,因此排序时将忽略字符大小写
最后,你可以根据自己需求来调整上面的函数 。
String.prototype.localeCompare()在上面的示例中,我们希望能够对对象数组进行排序,其值可以是字符串或数字 。但是,如果我们知道处理值是字符串的对象,则可以使用 JS 的localeCompare方法
比较两个字符串,并返回下列值中的一个:

  • 如果 字符串 在 字母 表中 应该 排在 字符串 参数 之前,则 返回 一个 负数;
  • 如果 字符串 等于 字符串 参数,则 返回 0;
  • 字符串 在 字母 表中 应该 排在 字符串 参数 之后,则 返回 一个 正数;
['bjork', 'Bjork', 'Björk'].sort();// [ 'Bjork', 'Björk', 'bjork' ]['bjork', 'Bjork', 'Björk'].sort((a, b) => a.localeCompare(b));//  [ 'bjork', 'Bjork', 'Björk' ]根据compareValues函数,我们可以这么写:
function compareValues(key, order = 'asc') {  return function innerSort(a, b) {    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) return 0;    const comparison = a[key].localeCompare(b[key]);    return (      (order === 'desc') ? (comparison * -1) : comparison    );  };}


推荐阅读