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)

TA贡献1847条经验 获得超7个赞
先说答案: 有可能。但是需要调用者传入更多的信息。
先来分析一下排序需要指导哪些信息:
比较 campare: 怎么去比较元素的大小
交换 swap :怎么来交换俩个元素的位置
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这个接口,这个接口中有我前面提到的三个函数。
添加回答
举报