写点什么

如何对数组中的对象进行排序

作者:Changing Lin
  • 2021 年 12 月 11 日
  • 本文字数:1440 字

    阅读完需:约 5 分钟

1.知识点

  • 在一个设备列表中,假设我们想实现有策略、有规律的排列顺序,按照用户想要特定的顺序来排列,如下图所示,那么是否有方法可以实现呢?

2.原理

  • 在 js 环境中,数组有一个 Arrays.sort 方法,可以用于对数组进行排序

array.sort(compareFunction)
compareFunction 可选。定义替代排序顺序的函数。该函数应返回负值、零值或正值,具体取决于参数,例如:function(a, b){return a-b}sort() 方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。
复制代码

3.源码

  • 假设我们有一个无序的输入数组,数组中每个元素包含 2 个属性,name 和 age,我们希望编写一个方法,按照名字或年龄来排序,并且返回排序后的数组:

const SOURCES = [    {        name: "Alice",        age: 18    },    {        name: "Bob",        age: 14    },    {        name: "Cindy",        age: 11    },    {        name: "Divid",        age: 20    },]
复制代码
  • 例子程序如下:


const TAG = "这是一个按照条件排序的例程:"function main(){ console.log(TAG, "开始")
let unordered = SOURCES // console.log(JSON.stringify(unordered)); // const ordered = Object.keys(unordered).sort().reduce( // (obj, key) => { // console.warn(TAG, obj, key) // obj[key] = unordered[key]; // return obj; // }, // {} // ); // console.log(JSON.stringify(ordered));
let byAge = SOURCES.slice(0); byAge.sort(function(a,b) { return a.age - b.age; }); console.log(TAG, JSON.stringify(SOURCES)); console.log(TAG, JSON.stringify(byAge));
let byName = SOURCES.slice(0); byName.sort(function(a,b) { let x = a.name.toLowerCase(); let y = b.name.toLowerCase(); return x < y ? -1 : x > y ? 1 : 0; }); console.log(TAG, JSON.stringify(byName)); console.log(TAG, "结束")}
main()
复制代码
  • 运行结果

这是一个按照条件排序的例程: 开始源数组: [{"name":"Alice","age":18},{"name":"Bob","age":14},{"name":"Cindy","age":11},{"name":"Divid","age":20}]按照元素年龄排序结果: [{"name":"Cindy","age":11},{"name":"Bob","age":14},{"name":"Alice","age":18},{"name":"Divid","age":20}]按照元素名称排序结果: [{"name":"Alice","age":18},{"name":"Bob","age":14},{"name":"Cindy","age":11},{"name":"Divid","age":20}]这是一个按照条件排序的例程: 结束
复制代码
  • 可以看到,使用 Array.sort()方法,可以对数组根据不同的元素属性值大小进行排序,实现我们的需求,我们可以封装一个简单的排序算法:


/** * 根据数组中元素的属性名排序 * @param {数组} arrays * @param {数组元素的属性名} key * @returns 排序后的数组,小的在前 */function sortArrayByKey(arrays, key){ let newArrays = arrays.slice(0) newArrays.sort(function(a, b) { if (typeof a[key] === "string") { let x = a[key].toLowerCase() let y = b[key].toLowerCase() return x < y ? -1 : x > y ? 1 : 0 }else if(typeof a[key] === "number") return a[key] - b[key] else return a[key] - b[key] }) return newArrays}
复制代码


发布于: 2 小时前阅读数: 5
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
如何对数组中的对象进行排序