用JavaScript实现数组的排序与去重

数组去重

假设有数组array = [1,5,2,3,4,2,3,1,3,4],你要写一个函数unique,使得unique(array)的值为 [1,5,2,3,4]

方法一:不使用set

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
let array = [1,5,2,3,4,2,3,1,3,4]

function unique(array){
    let hash = []
    for(let i=0;i<array.length; i++){
        hash[array[i]] = true
    }
    let result = []
    for(let key in hash){
        result.push(key)
    }
    return result
}

这种方法只支持数字或者字符串数组,如果数组里面有对象,就会出错。

方法二:使用set

1
2
3
4
5
let array = [1,5,2,3,4,2,3,1,3,4]

function unique(array){
    return  Array.from(new Set(array))
}

该方法使用的API 太新,一些浏览器不支持。

方法三:使用Map

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
let array = [1,5,2,3,4,2,3,1,3,4]

function unique(array){
  let map = new Map();
  let result = []
  for (let i = 0; i < array.length; i++) {
    if(map.has(array[i])) { // 判断 map 中是否已有该 key 
      continue
    } else {  // 如果 map 中没有该 key,就加入 result 中
      map.set(array[i], true);  
      result.push(array[i]);
    }
  } 
  return result;
}

该方法同样有API 太新,一些浏览器不支持的问题。

数组排序

给出正整数数组array = [2,1,5,3,8,4,9,5],请写出一个函数sort,使得sort(array)得到从小到大排好序的数组[1,2,3,4,5,5,8,9]

方法一:不使用 JS内置的sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//确定最小数下标
let minFlag = (strings) => {
    let flag = 0;
    for (let i = 0; i < strings.length; i++) {
        if (strings[i] < strings[flag]) {
            flag = i;
        } 
    }  return flag
};
//交换两数位置
let swap = (array, i, j) => {
    let temp = array[i];
    array[i] = array[j];
    array[j] = temp;
};
//
function sort(array) {
    for (let i = 0; i < array.length - 1; i++) {
        //通过slice切片不改变原数组的方法,确定最小值下标,交换至首位
        //然后“切除”首位,进行下轮最小筛选,推送至次位,直至排序完成
        let index = minFlag(array.slice(i)) + i ; 
        if (index !== i) {
            swap(array, index, i );
        }
    }
    return array;
}
let  array = [2,1,5,3,8,4,9,5]
console.log(sort(array))