數組的去重和排序

數組去重解析

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() 返回數組中某個指定元素第一次出現的位置,沒有找到指定元素則返回-1bash

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

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

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 輪把其中最大一項放到對尾spa

選擇排序

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 和 最小值的 索引默認爲第一項,.net

第二個循環遍歷數組中除i項外, 發現有比min的元素小,當即從新對min賦值,第二層循環結束。code

在第一層循環中,把當前這一項備份 ,爲了調換位置使用 var temp = a[i]blog

當前這一項和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…

相關文章
相關標籤/搜索