站長資訊網
        最全最豐富的資訊網站

        經典技巧之JavaScript數組操作(整理分享)

        本篇文章給大家帶來了關于JavaScript中數組的相關操作,主要包括Array對象原型方法以及常用操作去重、扁平化、排序等,希望對大家有幫助。

        經典技巧之JavaScript數組操作(整理分享)

        JavasScript數組操作, 主要包括Array對象原型方法以及常用操作去重、扁平化、排序等

        Array.prototype

        forEach

        arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

        • callback為數組中每個元素執行的函數, 該函數接收一至三個參數

        • currentValue數組中正在處理等當前元素的索引

        • array可選[表示正在操作的數組]

        • thisArg可選[當執行回調函數時, 用作this的值, 當使用箭頭函數時此參數將被忽略]

        forEach()對數組的每一個元素執行一次給定的函數

        let arr = [1, 2, 3, 4, 5]; let obj = {a: 1}; arr.forEach(function(currentValue, index, array) {   console.log("當前值:", currentValue);// 1   console.log("當前值索引:", index);// 0   console.log("當前處理數組:", array); // (5)[1, 2, 3, 4, 5]   console.log("當前this指向:", this);// {a: 1}   console.log("結束一次回調, 無需返回值");   console.log(""); }, obj); console.log(arr);// [1, 2, 3, 4, 5]不改變原數組

        map

        arr.map(callback(currentValue [, index [, array]])[, thisArg])

        • callback為數組每個元素執行的函數, 該函數接收一至三個參數

        • currentValue數組中正在處理的當前元素

        • index可選[數組中正在處理的當前元素的索引]

        • array可選[正在操作的數組]

        • thisArg可選[當執行回調函數時, 用作this的值, 當使用箭頭函數時此函數將被忽略]

        map()創建一個新數組, 其結果是該數組中的每個元素都被調用一次提供的函數后的返回值

        let arr = [1, 2, 3, 4, 5]; let obj = {a: 1}; let newArr = arr.map(function(currentValue, index, array) {   console.log("當前值:", currentValue);// 1   console.log("當前值索引:", index);// 0   console.log("當前處理數組:", array); // (5)[1, 2, 3, 4, 5]   console.log("當前this指向: ", this); // {a: 1}   console.log("");   return crrentValue + 10; }, obj); console.log(newArr);// [11, 12, 13, 14, 15] console.log(arr);// [1, 2, 3, 4, 5]不改變原數組

        push

        arr.push(element1[,…, elementN])

        elementN被添加到數組末尾的元素

        push()將一個或多個元素添加到數組的末尾, 并返回該數組的長度

        let arr = ['a', 'b', 'c', 'd', 'e']; console.log(arr.push('f', 'g'));// 7 console.log(arr);// ["a", "b", "c", "d", "e", "f", "g"] 改變原數組

        pop

        pop()數組中刪除最后一個元素, 并返回該元素的值, 當數組為空時返回undefind, 此方法更改數組的長度

        let arr = [1, 2, 3, 4, 5]; console.log(arr.pop());// 5 console.log(arr);// [1, 2, 3, 4] 改變原數組

        shift

        shift()從數組中刪除第一個元素, 并返回該元素的值, 該方法會改變原數組

        let arr = [1, 2, 3, 4, 5] console.log(arr.shift());// 1 console.log(arr);// [2, 3, 4, 5] 改變原數組

        unshift

        arr.unshift(element1[, …, elementN])

        unshift()將一個或多個元素添加到數組的開頭, 并返回該數組的長度, 該方法修改原有數組

        let arr = [1, 2, 3, 4, 5] console.log(arr.unshift(-1, 0));// 7 console.log(arr);// [-1, 0, 1, 2, 3, 4, 5] 改變原數組

        splice

        arrar.splice(start[, deleteCount[, item1[, item2[, …]]]])

        start指定修改的開始位置, 如果超出了數組的長度, 則從數組末尾開始添加內容; 如果是負值, 則表示從數組末尾開始的第幾位(從-1計數, 這意味著-n是倒數第n個元素并且等價于array.length-1); 如果負數的絕對值大于數組的長度, 則表示開始位置為第0位

        deleteCount可選[整數], 表示要移除的數組元素的個數. 如果deleteCount大于start之后元素的總數, 則從statr后面的元素都將被刪除(含第start位). 如果deleteCount被省略, 或者它的值大于等于array.length-start(也就是說, 如果它大于或者等于start之后的所有元素的數量), 那么start之后數組的所有元素都會被刪除

        item1, item2, …可選[要添加進數組的元素, 從start位置開始. 如果不指定, 則splice()將只刪除數組元素]

        splice()通過刪除或替換現有元素或者原地添加新的元素來修改數組, 并以數組形式返回被修改的內容, 此方法會改變原數組

        let arr = [1, 2, 3, 4, 5] console.log(arr.splice(1, 1));// [2] console.log(arr);// [1, 3, 4, 5] 改變原數組

        slice

        arr.slice([begin[, end]])

        begin可選[提取起始處的索引] 從該索引開始提取原數組元素. 如果該參數為負數, 則表示從原數組中的倒數第幾個元素開始提取, 如果省略begin, 則slice從索引0開始; 如果begin大于原數組的長度, 則會返回空數組

        end可選[提取終止處的索引], 在該索引處結束提取原數組元素. slice會提取原數組中索引從begin到end到所有元素, 包含begin, 但不包含end. 如果end 被省略, 則slice會一直提取到原數組末尾, 如果end大于數組的長度, slice也會一直提取到數組末尾

        slice()返回一個新的數組對象, 這一對象是一個由begin和end決定到原數組的淺拷貝, 包括begin, 不包括end, 原始數組不會被改變

        let arr = [1, 2, 3, 4, 5]; console.log(arr.sclice(1, 3));// [2, 3] console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        concat

        let new_array = old_array.concat(value[, value2[, …[, valueN]]])

        valueN可選[], 將數組或值連接成新數組, 如果省略了valueN參數, 則concat會返回一個它所調用的已存在的數組的淺拷貝

        concat()用于合并兩個或多個數組, 此方法不會更改現有數組, 而是返回一個新數組

        let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let arr3 = arr1.concat(arr2); console.log(arr3);// [1, 2, 3, 4, 5, 6] console.log(arr1);// [1, 2, 3] 不改變原數組

        join

        arr.join([separator])

        separator可選 指定一個字符串來分隔數組的每個元素

        join()將一個數組(或一個類數組對象)的所有元素連接成一個字符串并返回這個字符串. 如果數組只有一個項目, 那么將返回該項目而不使用分隔符

        let arr = ['a', 'b', 'c']; console.log(arr.join("&"));// a&b&c console.log(arr);// ["a", "b", "c"] 不改變數組

        sort

        arr.sort([compareFunction])

        compareFunction可選 用來指定按某種順序進行排列的函數. 如果省略, 元素按照轉換為第字符串的各個字符的Unicode進行排序

        firstEl第一個用于比較的元素

        secondEl第二個用于比較的元素

        sort()用原地算法對數組的元素進行排序, 并返回數組. 默認排序順序是在將元素轉換為字符串, 然后比較它們的UTF-16代碼單元值序列時構建的

        let arr = [1, 2, 3, 4, 5]; console.log(arr.sort((a, b) => b - a));// [5, 4, 3, 2, 1] console.log(arr);// [5, 4, 3, 2, 1] 改變原數組

        reverse

        reverse()將數組中元素的位置顛倒, 并返回該數組, 該方法會改變原數組

        let arr = [1, 2, 3, 4, 5]; console.log(arr.reverse());// [5, 4, 3, 2, 1] console.log(arr);// [5, 4, 3, 2, 1] 改變原數組

        every

        every()測試一個數組內的所有元素是否都能通過某個指定函數的測試, 返回一個布爾值

        let arr = [1, 2, 3, 4, 5]; console.log(arr.every(currentValue => currentValue > 1));// false console.log(arr);// 不改變原數組

        some

        some()測試數組中是不是至少有1個元素通過了提供的測試函數, 返回一個Boolean類型的值

        let arr = [1, 2, 3 ,4 ,5]; console.log(arr.some(currentValue => currentValue > 1));// true console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        filter

        filter()創建一個新數組, 其包含通過所提供的測試函數的所有元素

        let arr = [1, 2, 3, 4, 5]; console.log(arr.filter(currentValue => currentValue > 2));// [3, 4, 5] console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        find

        find()返回數組中滿足提供的測試函數的第一個元素的值, 否則返回undefined

        let arr = [1, 2, 3, 4, 5]; console.log(arr.find(currentValue => currentValue > 2));// 3 console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        findIndex

        findIndex()返回數組中滿足提供的測試函數的第一個元素的索引, 否則返回-1

        let arr = [1, 2, 3, 4, 5]; console.log(arr.findIndex(currentValue => currentValue > 2));// 2 console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        includes

        includes()用來判斷一個數組是否包含一個指定的值, 如果包含則返回true, 否則返回false

        let arr = [1, 2, 3, 4, 5]; console.log(arr.includes(2));// true console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        indexOf

        indexof()返回指定元素在數組中的第一個索引, 否則返回-1

        let arr = [1, 2, 3, 4, 5]; console.log(arr.indexOf(2));// 1 console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        lastIndexOf

        lastIndexOf()返回指定元素在數組中的的最后一個索引, 如果不存在則返回-1

        let arr = [1, 2, 3, 2, 1]; console.log(arr.lastIndexOf(2));// 3 console.log(arr);// [1, 2, 3, 2, 1] 不改變原數組

        fill

        fill()用一個固定值填充一個數組從起始索引到終止索引到全部元素, 不包括終止索引

        let arr = [1, 2, 3, 4, 5]; console.log(arr.fill(0, 0, 5));// [0, 0, 0, 0, 0] console.log(arr);// [0, 0, 0, 0 ,0] 改變數組

        flat

        flat()會按照一個可指定的深度遞歸遍歷數組, 并將所有元素與遍歷到的子數組中的元素合并為一個新數組返回

        let arr = [1, 2, [3, 4, [5]]]; console.log(arr.flat(2));// [1, 2, 3, 4, 5] console.log(arr);// [1, 2, [3, 4, [5]]] 不改變原數組

        keys

        keys()返回一個包含數組中每個索引鍵的Array Iterator對象

        let arr = [1, 2, 3, 4, 5]; let iterator = arr.keys(); for (const key of iterator) {   console.log(key);   // 0   // 1   // 2 } console.log(arr);// [1, 2, 3, 4, 5] 不改變原數組

        常用操作

        數組去重

        使用對象

        let arr = [1, 2, 3, 1, 1, 1, 3, 5, 3]; let obj = {}; let newArr = []; arr.forEach(v => {   if(!ogj[v]) {     ogj[v] = 1;     newArr.push(v);   } }) console.log(newArr);// [1, 2, 3, 5]

        使用Set

        let arr = [1, 2, 3, 1, 1, 1, 3, 5, 3]; let newArr = Array.from(new Set(arr)); // let newArr = [...(new Set(arr))];// 使用ES6解構賦值 console.log(newArr);// [1, 2, 3, 5]

        扁平化數組

        使用flat

        let arr = [1, 2, [3, 4, [5]]]; let newArr = arr.flat(2); console.log(newArr);// [1, 2, 3, 4, 5]

        遞歸實現flat

        function _flat(arr, maxN = 1, curN = 0) {   let newArr = [];   if (curN >= maxN) return arr;   arr.forEach((v, i, array) => {     if (Array.isArray(v)) {       newArr.push(..._flat(v, maxN, curN + 1));     } else newArr.push(v);   })   return newArr; } let arr = [1, 2, [3, 4, [5]]]; let newArr = _flat(arr, 1);// 扁平化一層 console.log(newArr);// [1, 2, 3, 4, [5]]

        統計一個字符串中出現最多的字符

        使用數組將字符的ASCII碼作為key制作桶

        let s = "ASASRKIADAA"; let arr = []; let base = 65;// A-Z 65-90 a-z 97-122 Array.prototype.forEach.call(s, (v) => {   let ascii = v.charCodeAt(0) - base;   if (arr[ascii]) {     ++arr[ascii];   } else arr[ascii] = 1; }) let max = 0; let maxIndex = 0; arr.forEach((v, i) => {   if (v > max) {     max = v;     maxIndex = i;   } }) console.log(String.fromCharCode(maxIndex + base), arr[maxIndex]);// A 5

        找出數組中的最大值

        遍歷數組

        let arr = [1, 2, 3, 1, 1, 1, 3, 5, 3]; let max = -Infinity; arr.forEach(v => {   if (v > max) max = v; }) console.log(max);// 5

        使用Math

        let arr = [1, 2, 3, 1, 1, 1, 3, 5, 3]; let max = Math.max(...arr); console.log(max);// 5

        使用reduce

        let arr = [1, 2, 3, 1, 1, 1, 3, 5, 3]; let max = arr.reduce((a, v) => {   return a > v ? a : v; }) console.log(max);// 5

        拷貝數組

        遍歷數組使用push

        let arr = [1, 2, 3, 4, 5]; let newArr = []; arr.forEach(v => newArr.push(v)); console.log(newArr);// [1, 2, 3, 4, 5]

        使用concat

        let arr = [1, 2, 3, 4, 5]; let newArr = [].concat(arr); console.log(newArr);// [1, 2, 3, 4, 5]

        使用slice

        let arr = [1, 2, 3, 4, 5]; let newArr = arr.slice(0); console.log(newArr);// [1, 2, 3, 4, 5];

        隨機打亂一個數組

        隨機交換N次

        function randomInt(a, b) {   return Number.parseInt(Math.random() * (b-a) + a); } let arr = [1, 2, 3, 4, 5]; let N = arr.length; arr.forEach((v, i, arr) => {   let ran = randomInt(0, N);   [arr[i], arr[ran]] = [arr[ran], arr[i]]; }) console.log(arr);

        隨機排序

        let arr = [1, 2, 3, 4, 5]; arr.sort((v1, v2) => {   return Math.random() >= 0.5 ? 1 : -1; }) console.log(arr);

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 99精品一区二区三区无码吞精| 亚洲一区精品中文字幕| 精品欧洲AV无码一区二区男男| 国产精品 羞羞答答在线 | 无码日韩人妻精品久久蜜桃| 国产精品99久久久久久www| 99久久精品国产麻豆| 日韩精品区一区二区三VR| 亚洲国产精品成人一区| 国产情侣大量精品视频| 久久精品免费观看| 99久久精品毛片免费播放| 精品黑人一区二区三区| 亚洲精品无码乱码成人| 合区精品中文字幕| 免费精品精品国产欧美在线| 国产精品天干天干在线综合 | 国产香蕉国产精品偷在线观看| 久久久精品一区二区三区| 国产精品女同一区二区| 麻豆成人久久精品二区三区免费| 亚洲国产精品成人一区| 无码国产亚洲日韩国精品视频一区二区三区 | 久久99精品久久久久久9蜜桃| 成人精品一区二区三区中文字幕| 无码少妇精品一区二区免费动态| 亚洲日韩欧美制服精品二区| 久久久久亚洲精品无码网址| 精品精品国产国产| 久久精品国产一区二区三区不卡| 久久精品国产色蜜蜜麻豆| 久久精品国产国产精品四凭| 久久久久久亚洲精品不卡 | 777被窝午夜精品影院| 青青草国产精品| 99久久99久久精品国产片果冻| 国产成人精品日本亚洲专区| 国产亚洲精品精品国产亚洲综合| 国产美女精品视频| 精品亚洲视频在线观看| 亚洲电影日韩精品|