JS 中数组的排序和去重
在 PHP 中,数组有很多排序方法,不过其他语言的数组中大概是不会像 JS 的数组一样,包罗万象,啥都通吃的。所以 JS 的数组排序情况就略多一些了。
- 简单粗暴的排序:
- 赤果果的sort:
var arr = ['Jason','Eric','Rose','Paul']
arr.sort()
// arr => ['Eric','Jason','Paul','Rose'];
-
-
- 这样排序的前提是数组本身元素类型单一,都为数字或者字符串,默认排序为按照首字母进行增序;
-
- 稍微不那么粗暴的:
- 有排序函数的sort:
- var arr = ['10','1000','3','20'];
arr.sort(); ==> ['10','1000','20','3']; - //现在我们想按照数字的值大小进行排序 0.0
//先定义一个排序函数 sortNumber
function sortNumber(a,b){
return a-b;
}
arr.sort(sortNumber); - 在有排序函数的时候,sort 会按照元素的 value 去排序,这样做得前提仍然是数组元素类型单一为 number 或者 string,默认也是增序排序的。
当然我们也可以认为通过指定排序函数返回值的方法来控制数组最终的排序方式:- return 1 ==》降序;
- return -1 ==》增序;
- 稍微复杂的排序:
-
- 上面介绍的排序方法都针对的是简单的数组,但是 JS 的数组是很复杂的,大多数情况我们处理后台返回的数据都会遇到数组中包含各种复杂的对象。这样听起来比较抽象,说一个我自己做东西的例子吧。假如现在有一个论坛,页面上成千上万的帖子,用户有一个搜索动作,但是进行的是模糊查询,他可能是按照帖子的作者author,帖子的名称title,或者帖子内容message查询的。帖子是存在 mongoDB中,我们根据用户输入的关键字,将其视为 title,author,message 进行查询,这样就获得了三个结果集,arr1,arr2,arr3。然后我们需要将结果集进行合并,得到 arr4。那么现在问题来了,我们如果直接合并三个结果集,其中必然有重复的帖子,这就涉及到数组的去重。当然,这里有一个方案,在合并三个结果集时,依次向新结果集逐个元素插入然后每次插入新元素去结果集中检索有没有当前要插入的元素,如果有就丢弃。但是这样每插入一个元素就要遍历整个数组并且还要对每个元素进行属性的遍历,很容易导致性能问题,所以这里介绍一下方案二,就是先暴力的合并,然后排序,最后进行去重处理。
- 要去重,我们先进行一下排序。注意,这里的数组元素就是各种复杂的对象了,但是这些对象都有唯一标识就是_id属性,所以我们就根据它们的_id 进行排序,这样相同的元素就处在了相邻的位置。
- 定义排序函数 sortByKey:根据_Id 进行排序:
var sortedArr = arr.sort(sortByKey('_id'));
var result = [];- function sortByKey (key){
return function(a,b){
return a[key] - b[key];
}
}
- function sortByKey (key){
- 去重生成最终结果集result:
(fucntion(){
var len = sortedArr.length;
for(var i=0; i<len;i++){
if(sortedArr[i]._id !== sortedArr[i+1]._id){
result.push(sortedArr[i]);
}
}
})()
-
JS 数组博大精深,数据处理时用到的非常频繁,用的不好通常会影响性能,欢迎各位道友批评指正,说说心得
To Be Architectures But Not Code Monkeys.
The Only Way To Do Great Work Is To Love What You Do.
Myths Are Public Dreams While Dreams Are Personal Myths.
The Only Way To Do Great Work Is To Love What You Do.
Myths Are Public Dreams While Dreams Are Personal Myths.
浙公网安备 33010602011771号