如果要让上面的顺序相反,可以这么做:
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 ); };}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 宕机了,Redis如何避免数据丢失?
- 怎么洗葡萄干净 葡萄如何清洗干净
- 如何为你的网站构建无服务器NLP聊天机器人
- 排名前5的JavaScript框架
- 大型小程序如何研发提效
- 如何在 Fedora 中安装 VirtualBox
- 重装系统时,如何判断启动方式Legacy/UEFI,你知道吗
- 隐私泄露之源?如何管好笔记本的摄像头?
- 安化黑茶如何收藏,魅力安化黑茶
- 龙井茶怎么泡,大麦茶怎么泡