转载: 查看原文

在javascript中,对象和数组是两种不同的类型,这和php中的数组概念不同。在javascript中,也有一些精妙的算法,用来对一些对象进行排序。我在面试迅雷的时候,也拿到一道题,当时做题的时候考虑到时间,没有去仔细研究,回来后再读了一些方法,就知道真正的考点在哪里了。

我们现在有一组“学生”对象,包含“名字,年龄”等属性,现在要求一个算法,把这些对象放在一个数组里,可以实现按照年龄对这些对象进行排序。

var sdts = [
{ name:"小明", age:12 },
{ name:"小红", age:13 },
{ name:"小花", age:11 }
]

那么考点在哪里呢?实际上在于数组对象的sort方法。

 sdts.sort(fun) 

fun是一个函数,排序根据这个函数返回值来进行判断,如果返回值小于0表示两个元素不需要交换位置,1表示要用交互位置,0表示相等,实际上<=0等效。

sort方法有两个注意点:

  1. 会操作原始数组,经过操作后原始数组发生变化
  2. 默认排序按照字符编码排序,例如,我们有下面的一个例子:
var arr1 = [14,23,11,6,87,67];
arr1.sort();// [11,14,23,6,67,87] 按字符而非数值排序

想要完成值比较排序,必须传入sort参数(函数)进行规则制定:

function sortRule(a, b) {
return a - b; // 如果a>=b,返回自然数,不用交换位置
}
arr1.sort(sortRule);

但是,如果遇到我们上面题目中一样,每个元素并非是数组,而是对象,那应该怎么去处理呢?其实道理是一样的,只不过我们要在规制函数中重新编写一个适合对象的规制:

functon sortRule(a, b) {
return a.age - b.age;
}

当然,这样写会遇到一些问题,这是我们在明确知道要进行排序的对象数组的情况,倘若对象数组元素不存在age属性,那就会报错了,因此,你在撰写自己的规则时,应该更加丰富它的规则判断。

加入我们现在不规定按照哪一个属性排序,比如除了age属性,我们还有学生的分数score属性,我们偶尔需要按照年龄排序,偶尔又需要按照score排序,希望能重复用这个算法,应该怎么办呢?

function sortBy(field) {
return function(a,b) {
return a[field] - b[field];
}
}
arr1.sort(sortBy("score"));

没错,核心的代码就这么简单了,一些可能抛出错误的判断,自己去考虑吧。在这种想法下面,我们还可以做一个设想:假如score相等的情况下,我们是否可以按照年龄的大小排序输出?

function sortBy(field1, field2) {
return function(a, b) {
if(a[field1] === b[field1]) return a[field2] - b[field2];
return a.field1 - b.field1;
}
}
arr1.sort(sortBy("score", "age"));

没错,其实也就这么简单,你甚至可以使用argments来获取更多的参数,用以传入更多的字段作为判断条件。

 

sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的更多相关文章

  1. javascript中对一个对象数组按照对象某个属性进行排序

    需求:对timelist排序 安装keys . 分析:timelist 是个数组对象,里面包含属性 keys,val.这里借助数组sort方法 传入function <script> // ...

  2. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  3. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  4. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  5. 详解 javascript中offsetleft属性的用法(转)

    详解 javascript中offsetleft属性的用法 转载  2015-11-11   投稿:mrr    我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...

  6. 详解CorelDRAW中如何合并与拆分对象

    合并两个或多个对象可以创建带有共同填充和轮廓属性的单个对象,以便将这些对象转换为单个曲线对象.可以合并的对象包括矩形.椭圆形.多边形.星形.螺纹.图形或文本等,本教程将详解CorelDRAW中关于合并 ...

  7. 详解 JavaScript 中 splice() 方法

    splice() 方法是一个比较少用的方法,但是功能确实很好,并且在我们 coding 的时候,经常有需要 splice() 方法,先介绍一下该方法. 在 JavaScript 中 splice() ...

  8. 详解JavaScript中的原型

    前言 原型.原型链应该是被大多数前端er说烂的词,但是应该还有很多人不能完整的解释这两个内容,当然也包括我自己. 最早一篇原型链文章写于2019年07月,那个时候也是费了老大劲才理解到了七八成,到现在 ...

  9. 【转】详解JavaScript中的异常处理方法

    有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ...

随机推荐

  1. mysql 案例 ~ mysql字符集详解

    一 谈谈mysql常见的字符集问题 二 字符集统一  1 character_set_server  2 character_set_client  3 java/php等连接字符集  4 chara ...

  2. oracle启用归档日志

    一.开启归档 1.查看归档信息 SQL> archive log list Database log mode No Archive Mode Automatic archival Disabl ...

  3. 使用多线程提高Rest服务性能

    ⒈使用Runnable异步处理Rest服务 /** *使用Runnable异步处理Rest服务 * @return */ @GetMapping("/order") public ...

  4. Pytorch之验证码识别

    本文主要实现了两个工作:1.验证码生成   2.Pytorch识别验证码 一. 验证码生成 方法1. 利用PIL库的ImageDraw实现绘图,此法参考博客实现: #!/usr/bin/env pyt ...

  5. k64 datasheet学习笔记52---Universal Asynchronous Receiver/Transmitter (UART)

    1.前言 UART实现与外设或CPU的通信 2. UART概述 2.1基本特性 (1)Full-duplex operation (2)Standard mark/space non-return-t ...

  6. delphi 的 ORM 框架

    delphi 的 ORM 框架,收集如下: 1.EntityDac    https://www.devart.com/entitydac/download.html 2.mORMot    The  ...

  7. vs 快捷键操作

    各个版本可能不同,以vs 2013为例. 1.调试时,调出即时窗口:[Ctrl+Alt+i] 2.注释/取消注释:[Ctrl+K Ctrl+C]/[Ctrl+K Ctrl+U]

  8. 题解-hzy loves segment tree I

    Problem 题目概要:给定一棵 \(n\) 个节点的树,点有点权,进行 \(m\) 次路径取\(\max\)的操作,最后统一输出点权 \(n\leq 10^5,m\leq 5\times 10^6 ...

  9. 神经网络中的偏置项b到底是什么?

    原文地址:https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408 前言        很多人不明白为什么要在神经网络.逻 ...

  10. (转!)Pyinstaller 打包发布经验总结

    原文地址 https://blog.csdn.net/weixin_42052836/article/details/82315118 具体的实现图待本人实现后贴上 原 Pyinstaller 打包发 ...