js中一些數據處理方法

1. 數組中是否存在某個值?

數組自帶方法

var arr = [1, 2, 4, 3, 5, 6]
console.log(arr.includes(4))
console.log(arr.some(item => item === 4))
console.log(arr.find(item => item === 4))
console.log(arr.findIndex(item => item === 4))
console.log(arr.indexOf(4) !== -1)
console.log(arr.filter(item => item === 4))
// for 循環,略

其餘各類"神奇"的算法

  • 先排序,而後二分法查找
  • set 解法,利用 set 的惟一性,將目標值添加進 set,若是 set 長度沒變的話,這個值就是存在的
var arr = [1,2,3,4,5,6]
var arrSet = new Set(arr)
let prevSetLen = arrSet.size
arrSet.add(5)
console.log(prevSetLen===arrSet.length)
  • 利用數組的 join 方法,把全部數字用逗號拼起來,而後正則匹配,或是調 includes 方法

2. 找出兩個數組中的交集?

常規蠢辦法

  • for 循環
var arr1 = [1, 2, 3]
var arr2 = [3, 4, 5, 6]

var commonArr = []
for (var i = 0; i < arr1.length; i++) {
  var _item = arr1[i]
  for (var j = 0; j < arr2.length; j++) {
    if (_item === arr2[j]) {
      commonArr.push(_item)
    }
  }
}
  • ES6 的 filter 結合 includes 方法
var arr1 = [1, 2, 3]
var arr2 = [3, 4, 5, 6]

arr1.filter(item=>arr2.includes(item))
  • 一個數組轉對象,一個數組遍歷看對象是否存在對應值
var arr1 = [1, 2, 3]
var arr2 = [3, 4, 5, 6]
var _obj = {}
let _tempArr = arr1.length > arr2.length ? arr2 : arr1
_tempArr.forEach(item => {
  _obj[item] = item
})
let commonArr = arr2.filter(item => _obj[item])
console.log(commonArr)
_obj = null
_tempArr = null
這裏先判斷數組長度,選一個短的數組,使得新建立的臨時對象儘量小。
  • 若是不考慮單個數組裏有重複項的話,能夠先合併數組,而後再遍歷合併後的數組,進行計次,大於2則是重疊的。
var arr1 = [1, 2, 3]
var arr2 = [3, 4, 5, 6]

var _tempArr = arr1.concat(arr2).sort()
var result = []
_tempArr.reduce((prev, now) => {
  if (prev === now) {
    result.push(now)
  }
  return now
})
  • set 的使用,主要利用不可重複設置,判斷長度是否有變化,而得出是不是重複了;或者直接用 has 方法
var arr1 = [1, 2, 3]
var arr2 = [3, 4, 5, 6]

var set = new Set(arr1)
var result = []
result = arr2.filter(item => arr1.has(item))
console.log(result)

"神奇"的算法

  • 排序後,兩個數組下標移動,兩兩比較
var arr1 = [1, 2, 8, 3 ]
var arr2 = [5, 6, 2, 3, 4]

arr1.sort() // [1,2,3]
arr2.sort() // [2,3,4,5,6]

var result = []
let arr1Index = 0
let arr2Index = 0
let runTimes = 0
while (arr1Index < arr1.length && arr2Index < arr2.length) {
  runTimes++
  let arr1Item = arr1[arr1Index]
  let arr2Item = arr2[arr2Index]
  if (arr1Item > arr2Item) {
    arr2Index++
  } else if (arr1Item < arr2Item) {
    arr1Index++
  } else {
    result.push(arr1Item)
    arr1Index++
    arr2Index++
  }
}
console.log(result)
console.log(runTimes)

3.兩個數組的並集?

  • set
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 3, 6]
var result = [...new Set(arr1.concat(arr2))]
// var result = [...new Set([...arr1, ...arr2])]
  • reduce
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 3, 6]
var tempArr = [...arr1, ...arr2].sort()
var result = []
tempArr.reduce((prev, now) => {
  if (prev !== now) {
    result.push(now)
  }
  return now
}, null)
console.log(result)
  • 轉 json 對象
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 3, 6]    
var obj = {}
arr1.forEach(item => (obj[item] = item))
arr2.forEach(item => (obj[item] = item))
var result = Object.values(obj)
console.log(result)

4. 數組去重?

效率上講,轉 obj 的方式 > set > reduce > includes/indexOf > 雙重for循環算法

  • 雙重for循環
var arr1 = [1, 2, 3, 3, 4, 5, 6, 8]
var result = []
for (var i = 0; i < arr1.length; i++) {
  let _hasItem = false
  for (var j = 0; j < result.length; j++) {
    if (arr1[i] === result[j]) {
      _hasItem = true
      break
    }
  }
  if (!_hasItem) {
    result.push(arr1[i])
  }
}
console.log(result)
  • includes/indexOf
var arr1 = [1, 2, 3, 3, 4, 5, 6, 8]
var result = []
arr1.forEach(item => {
  if (!result.includes(item)) {
    result.push(item)
  }
})
  • reduce
var arr1 = [1, 2, 4, 5, 3, 3, 3, 6, 8]
arr1.sort()
var result = []
arr1.reduce((prev, now) => {
  if (now !== prev) {
    result.push(now)
  }
  return now
}, null)
  • set
var arr1 = [1, 2, 4, 5, 3, 3, 3, 6, 8]
var result = [...new Set(arr1)]
  • 轉對象方式
var arr1 = [1, 2, 4, 5, 3, 3, 3, 6, 8]
var obj = {}
arr1.forEach(item => (obj[item] = item))
var result = Object.values(obj)

5. 數組排序?

自帶 sort

var arr = [2,3,1,4,6]
arr.sort(); // [1,2,3,4,6]
arr.sort((a,b)=>a-b); // [1,2,3,4,6]
arr.sort((a,b)=>b-a); // [6,4,3,2,1]

選擇排序

每一次選擇遍歷選擇一個最小值,肯定一個位置json

var times = 0
function selectSort(arr) {
  // 沒遍歷一輪,將肯定一個位置
  for (var i = 0; i < arr.length; i++) {
    // 假定當前項是剩餘未排中最小的
    let minIndex = i
    // 從已經肯定的位置以後一位開始遍歷
    for (var j = i + 1; j < arr.length; j++) {
      // 假如找到比 min 還小的,更新最小值
      if (arr[j] < arr[minIndex]) {
        minIndex = j
      }
    }
    // 獲得最小值,第i位肯定
    let temp = arr[i]
    arr[i] = arr[minIndex]
    arr[minIndex] = temp
  }
}

冒泡排序

核心爲兩兩按大小規則交換數組

function bubbSort(arr) {
  for (var i = 0; i < arr.length; i++) {
    // 74
    for (var j = i + 1; j < arr.length; j++) {
      // 若是後面一個大於前面一個,那麼換位置
      if (arr[j] < arr[i]) {
        var temp = arr[j]
        arr[j] = arr[i]
        arr[i] = temp
      }
    }
  }
}

快速排序

  1. 先隨機選一個數(可選中間值)
  2. 以這個數分組,小的放左邊,大的放右邊
  3. 同理,在左邊和右邊的分組執行相同的操做,直到分組只剩一個元素
var arr = [74, 28, 60, 41, 29, 90, 52, 40]

function quickSort(arr){
  // 遞歸出口
  if(arr.length<=1){
    return arr
  }
  // 1. 選中值
  var basicNum = arr[Math.floor((arr.length - 1) / 2)]
  // 2. 左右分組
  var left = []
  var right = []
  arr.forEach(item=>{
    if(item>basicNum){
      right.push(item)
        }
    else{
      left.push(item)
    }
  })
  // 3.遞歸執行左邊和右邊數組,而且合併結果
  return quickSort(left).concat(basicNum, quickSort(right))
}
最簡單也是空間複雜度高的排序,當前只能理解到這種了,之後理解了優化的再更新。😅

歸併排序,插入排序之後有時間再總結下優化

相關文章
相關標籤/搜索