为了账号安全,请及时绑定邮箱和手机立即绑定

JS选择排序

JS选择排序

守候你守候我 2019-02-21 22:19:51
写了一个选择排序的函数,正常的传入数字或者字母都是可以的,但是有没有可能改我自定义类型的?这是我的选择排序函数。function px(array) {    for (let i = 0; i < array.length; i++) {        let minIndex = i;        for (let j = i + 1; j < array.length; j++) {            if (array[j] < array[minIndex]) {                minIndex = j;            }        }        [array[minIndex], array[i]] = [array[i], array[minIndex]]    }    return array;}假设现在我希望传入一组学生的信息,来进行排序[{ 'D': 90 }, { 'A': 20 }, { 'B': 50 }, { 'C': 10 }]希望输出[{ 'C': 10 }, { 'A': 20 }, { 'B': 50 }, { 'D': 90 }]我想像这样改成一个自定义类型的,我应该怎么做,如何自定义这个类型~附上C++实现的方法
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

var arr = [{ 'D': 90 }, { 'A': 20 }, { 'B': 50 }, { 'C': 10 }]

function values(o) { return Object.keys(o).map(function(k){return o[k]}) }

arr = arr.sort((a,b)=>{

  let v1 = values(a)

  let v2 = values(b)

  if(v1>v2){

    return 1

  }

})


console.log(arr)


查看完整回答
反对 回复 2019-02-26
?
aluckdog

TA贡献1847条经验 获得超7个赞

先说答案: 有可能。但是需要调用者传入更多的信息。
先来分析一下排序需要指导哪些信息:

  1. 比较 campare: 怎么去比较元素的大小

  2. 交换 swap :怎么来交换俩个元素的位置

  3. list的长度 len :怎么获取list的长度

我们看一下v8引擎给我们提供的接口,Array.prototype.sort():

sort() 方法在适当的位置对数组的元素进行排序,并返回数组。 sort 排序不一定是稳定的。默认排序顺序是根据字符串Unicode码点。arr.sort() arr.sort(compareFunction)

这个接口要求我们传入一个compareFunction。也就是我前面所说的campare,那么swap和len呢?因为是对数组进行排序,那么Array这个类型信息中已经包含了这俩个function,swap 就是直接交换。 len 就是 Array.length。所以你可以模仿这这个接口完成你自己的排序功能,进行比较的时候,调用函数传入的campare function 而不是 '<'或者 '>'。那么问题你的问题就解决了。排序函数的调用者每次为自己的类型多写一个campare function 就可以复用 这个排序函数。看一下你给出来的c++的例子,运算符重载'<',不正是传进去的那个campare function 吗? 只是语言的语法不同导致的表达方式的不同而已,所需要的信息从来没有变过。
既然说到了这里,就展开来说一下len, 和 swap 怎么使用。 前面我们所讲的都是多数组进行排序。我想为自己写的一个链表进行排序,怎么办呢? 那么你再传入len, swap 就可以了len 获取长度,swap 交换元素。我们的排序函数就能更好的复用了。当然了这样写的话就会显得又臭又长,而且js中我们一般也不会自己去写一个链表,Array可以当链表用。
开拓一下眼界,看看在别的语言是怎么做的。在java中因为有接口这一语法,所以就让你实现comparable 这个接口,这个接口中有什么函数呢?就一个campareTo;golang中 让你去实现sort.Interface这个接口,这个接口中有我前面提到的三个函数。


查看完整回答
反对 回复 2019-02-26
  • 2 回答
  • 0 关注
  • 820 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号