摘要:如果不考慮單個數(shù)組里有重復(fù)項的話,可以先合并數(shù)組,然后再遍歷合并后的數(shù)組,進行計次,大于則是重疊的。
1. 數(shù)組中是否存在某個值? 數(shù)組自帶方法
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 循環(huán),略其他各種"神奇"的算法
先排序,然后二分法查找
set 解法,利用 set 的唯一性,將目標(biāo)值添加進 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)
利用數(shù)組的 join 方法,把所有數(shù)字用逗號拼起來,然后正則匹配,或是調(diào) includes 方法
2. 找出兩個數(shù)組中的交集? 常規(guī)蠢辦法for 循環(huán)
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 結(jié)合 includes 方法
var arr1 = [1, 2, 3] var arr2 = [3, 4, 5, 6] arr1.filter(item=>arr2.includes(item))
一個數(shù)組轉(zhuǎn)對象,一個數(shù)組遍歷看對象是否存在對應(yīng)值
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
這里先判斷數(shù)組長度,選一個短的數(shù)組,使得新創(chuàng)建的臨時對象盡可能小。
如果不考慮單個數(shù)組里有重復(fù)項的話,可以先合并數(shù)組,然后再遍歷合并后的數(shù)組,進行計次,大于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 的使用,主要利用不可重復(fù)設(shè)置,判斷長度是否有變化,而得出是否是重復(fù)了;或者直接用 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)"神奇"的算法
排序后,兩個數(shù)組下標(biāo)移動,兩兩比較
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.兩個數(shù)組的并集?
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)
轉(zhuǎn) 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. 數(shù)組去重?
效率上講,轉(zhuǎn) obj 的方式 > set > reduce > includes/indexOf > 雙重for循環(huán)
雙重for循環(huán)
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)]
轉(zhuǎn)對象方式
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. 數(shù)組排序? 自帶 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]選擇排序
每一次選擇遍歷選擇一個最小值,確定一個位置
var times = 0 function selectSort(arr) { // 沒遍歷一輪,將確定一個位置 for (var i = 0; i < arr.length; i++) { // 假定當(dāng)前項是剩余未排中最小的 let minIndex = i // 從已經(jīng)確定的位置之后一位開始遍歷 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 } }冒泡排序
核心為兩兩按大小規(guī)則交換
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 } } } }快速排序
先隨機選一個數(shù)(可選中間值)
以這個數(shù)分組,小的放左邊,大的放右邊
同理,在左邊和右邊的分組執(zhí)行相同的操作,直到分組只剩一個元素
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.遞歸執(zhí)行左邊和右邊數(shù)組,并且合并結(jié)果 return quickSort(left).concat(basicNum, quickSort(right)) }
最簡單也是空間復(fù)雜度高的排序,當(dāng)前只能理解到這種了,以后理解了優(yōu)化的再更新。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105186.html
摘要:是一個優(yōu)秀的視頻播放器庫,不過官網(wǎng)的示例中,是作為全局變量引入的。如果我們的項目使用風(fēng)格的模塊,用來做打包的話,就需要做一些額外的工作。本文介紹我在使用的時候遇到的一些坑。這個是用來處理文件的。第二種方法是使用,直接把全局變量暴露出來。 video.js是一個優(yōu)秀的視頻播放器庫,不過官網(wǎng)的示例中,是作為全局變量videojs引入的。如果我們的項目使用ES6風(fēng)格的模塊,用webpack來...
摘要:組件模板與組件數(shù)據(jù)結(jié)合后生成的節(jié)點樹,將被插入到組件的引用位置上。事件用于子組件向父組件傳遞數(shù)據(jù),可以傳遞任意數(shù)據(jù)。官方文檔往期回顧填坑手冊小程序生成海報一拆彈時刻小程序生成海報二 showImg(https://user-gold-cdn.xitu.io/2019/6/19/16b6e94bcde767a1?w=1069&h=652&f=jpeg&s=120912); 小程序目錄結(jié)構(gòu)...
摘要:由于公司的前端開始轉(zhuǎn)向,最近開始使用這個框架進行開發(fā),遇到一些問題記錄下來,以備后用。查了一下,發(fā)現(xiàn)可能是打包或是資源引用問題,目前該問題還未被妥善處理,需要通過一些來解決這個問題。為解決這個問題,中提供了方法對象受現(xiàn) showImg(https://segmentfault.com/img/bVFgor?w=1280&h=720); 由于公司的前端開始轉(zhuǎn)向 VueJS,最近開始使用這...
摘要:中和的交互方式在進行交互之前需要我們對進行設(shè)置開啟對的支持。定義和相關(guān)的交互類和方法,對于方法通過注解進行標(biāo)注。向添加該,同時為其指定一個名稱,該名稱將會在文件中使用。傳遞的數(shù)據(jù)中有一個端口號,通過這個端口號作為標(biāo)示,來調(diào)用相應(yīng)的方法。 隨著H5性能的提升,在我們移動應(yīng)用開發(fā)的過程中,我們會越來越多的在我們的App頁面內(nèi)嵌入H5頁面,使得App變的更加動態(tài)靈活。而H5頁面往往并不是獨立...
摘要:初學(xué)應(yīng)該學(xué)習(xí)哪些知識主要學(xué)習(xí)基礎(chǔ)知識。接下來要學(xué)習(xí)如何寫函數(shù),計算屬性。事件處理與修飾符事件通過指令來綁定,在中事件為事件名,所以是很好記憶的。這時可通過來獲取父組件傳遞的值并寫入模板,父組件可通過在子組件寫入屬性的方式傳遞數(shù)據(jù)。 前言 本人剛開始學(xué)習(xí)vue.js幾天,做了一些練習(xí)之后,鑒于每隔一段時間就把學(xué)習(xí)過的內(nèi)容總結(jié)一番,故此寫下此文章。初學(xué)Vue.js應(yīng)該學(xué)習(xí)哪些知識 1、 v...
閱讀 2326·2021-09-22 15:27
閱讀 3178·2021-09-03 10:32
閱讀 3506·2021-09-01 11:38
閱讀 2503·2019-08-30 15:56
閱讀 2220·2019-08-30 13:01
閱讀 1543·2019-08-29 12:13
閱讀 1425·2019-08-26 13:33
閱讀 899·2019-08-26 13:30