陣列的去重和排序

JOKER_發表於2019-02-19

陣列去重解析

var arr = [1,4,12,4,5,125,4512,4,4]
複製程式碼

Set建構函式

通過new Set() 生成一個類陣列,並沒有重複的值

let [...result] = new Set(arr) 
// [ 1, 4, 12, 5, 125, 4512 ]
複製程式碼

或者可以使用Array.from(), 可以把類陣列轉換成陣列結合使用

let result = Array.from(new Set(arr)) 
// [ 1, 4, 12, 5, 125, 4512 ]
複製程式碼

Array.indexOf()

Array.indexOf() 返回陣列中某個指定元素第一次出現的位置,沒有找到指定元素則返回-1

var result = arr.filter((item,index) => {
    return arr.indexOf(item) === index
})
複製程式碼
  1. filter函式會返回當前迴圈的這一項的判斷結果,為true則保留這一項, 反之捨棄這一項,在這裡第一次出現的4在索引1的位置,並記錄下來 ; 最後兩個4的索引 不等於第一次記錄4的索引位置,所以返回 false 並不會被保留

  2. 另一種思路或者利用indexOf沒找到指定元素返回-1這一特性,把這心不重複的元素push到新陣列中

let newArr = []
let result =  arr.forEach(item => {
    if(newArr.indexOf(item) === -1) {
        newArr.push(item)
    }
})
console.log(newArr)
// [ 1, 4, 12, 5, 125, 4512 ]
複製程式碼
  1. 類似indexOf 方法使用js實現去重,定義一個空陣列,迴圈要去重的陣列,如果新陣列中有當前這一項break,如果沒有就push進去
let newArr = []
const isRepeat;
for(let i=0; i<arr.length;i++) {
 isRepeat = false
 for( let j=0; j< newArr.length;j++) {
    if(arr[i] === newArr[j]) {
        isRepeat = true
        break
    }  
 }
 if(!isRepeat) {
    newArr.push(arr[i])
 }
}
console.log(newArr)
[ 1, 4, 12, 5, 125, 4512 ]
複製程式碼

Map建構函式

let tmp = new Map()
let result = arr.filter(item => {
    return !tmp.has(item) && tmp.set(item, 1)
})
console.log(result)
// [ 1, 4, 12, 5, 125, 4512 ]
複製程式碼

obj特性去重

let arr = [1, 2, 3, 4, 12, 4, 1, 2]

function fn(arr) {
    let obj = {};
    arr.forEach((item) => {
        obj[item] = '';
    })
    return Object.keys(obj)
}
console.log(fn(arr))
// [ '1', '2', '3', '4', '12' ]
複製程式碼

氣泡排序

var a = [45,67,23,88,21,6,99];
for(let i=0; i < a.length-1; i++) {
   for(let j=0; j< a.length-1-i; j++) {
       if(a[j] > a[j+1]) {
           var temp = a[j]
           a[j] = a[j + 1]
           a[j+1] = temp
       }
   }
}
console.log(a) 
// [ 6, 21, 23, 45, 67, 88, 99 ]
複製程式碼

相鄰兩個比較,i項大於i+1項互換位置,迴圈a.length -1 輪把其中最大一項放到對尾

選擇排序

var a = [45,67,23,88,21,6,99];
let min; // 最小值
let pos; // 最小值下標
for(let i=0;i<a.length;i++) {
    min = a[i]
    pos = i
    for(let j=i+1;j<a.length;j++) {
        if(a[j] < min) {
            min = a[j]
            pos = j
        }
    }
    var temp = a[i]
    a[i] = min
    a[pos] = temp
}
console.log(a)
// [ 6, 21, 23, 45, 67, 88, 99 ]
複製程式碼

假定最小值min 和 最小值的 索引預設為第一項,

第二個迴圈遍歷陣列中除i項外, 發現有比min的元素小,立即重新對min賦值,第二層迴圈結束。

在第一層迴圈中,把當前這一項備份 ,為了調換位置使用 var temp = a[i]

當前這一項和min調換位置 a[i] = min a[pos] = temp

插入排序

var a=[45,67,23,88,21,6,99];
for(let i=0;i<a.length;i++) {
    for(let j=i;j>0 && a[j] < a[j-1];j--) {
        var temp = a[j]
        a[j] = a[j-1]
        a[j-1] = temp
    }
}
console.log(a)
// [ 6, 21, 23, 45, 67, 88, 99 ]
複製程式碼

當前這一項元素和它的前一項進行比較

如果當前的值小於他的前一項那麼調換位置, j--會使當前位置向前走一位,直到找到比他小的交換位置後,如果j < 0後跳出迴圈。最小值會移到陣列第一項。

排序演算法——插入排序 blog.csdn.net/xiaoping091…

相關文章