JS对象数组排序

in 未归类 with 0 comments, 3976 views

曾经遇到个需求,需要对一个数组进行排序,现在的话我会习惯性的去看下es6/7有没增加类似的快捷方法(-。-)Zzz人比较懒。

发现并没提到有关排序的扩展,只好硬着头皮自己写了个。首先看下JS原生提供的,毕竟存在既合理,物尽其用才是好的。

原生提供的排序---sort()

var arr = [3,6,9,41,5];
arr.sort(); // 输出 3,41,5,6,9

这个看起来很奇怪,并不能达到排序的要求,因为sort默认只能对字母进行排序,在这里我们需要定义一个比较函数做为参数传进sort。

var arr = [3,6,9,41,5];
arr.sort(function(a,b){return a-b}); // 输出 3,5,6,9,41

现在运行后就能得到我们需要的结果了,a和b分别代表数组的前后项,在比较函数中会依次比较进行排序。

不过往往实际项目中更常见的是对象数组进行排序[{key1:value1}...]

同样的,让sort可以帮助我们来做这件事情,不过还是需要点小技巧。

sort的比较函数乍看之下是针对纯数字进行排序的,直接把对象数组传进去进行比较排序明显不对。

/**
 * 对象数组按指定key排序
 * @param  {string} key - 键名
 * @param  {string} [order="ASC"] - 排序方式 "ASC" or "DESC" 
 */

function compare(key, order) {
    var order = order || "ASC";
    return function (a, b) {
        return order === "DESC" ? b[key] - a[key] : a[key] - b[key];
    }
}

var list = [{ _id: 1, view: 3 }, { _id: 2, view: 2 }, { _id: 3, view: 12 }, { _id: 4, view: 9 }];

list.sort(compare("view", "ASC"))

// => [{ _id: 2, view: 2 },{ _id: 1, view: 3 },  { _id: 4, view: 9 },{ _id: 3, view: 12 }]

上面例子中用到了高阶函数的特性,在compare内部返回一个我们需要的比较函数,同时又让a,b项变得可处理,不得不说js是表达能力很强的一门语言。

Responses ${replyToWho} / Cancel Reply