最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript中數(shù)組的常用算法深入分析

 更新時間:2019年03月12日 09:31:25   作者:saucxs  
這篇文章主要給大家介紹了關(guān)于javascript中數(shù)組的常用算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用javascript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

Array是Javascript構(gòu)成的一個重要的部分,它可以用來存儲字符串、對象、函數(shù)、Number,它是非常強大的。因此深入了解Array是前端必修的功課。本文將給大家詳細介紹了javascript中數(shù)組的常用算法,下面話不多說了,來一起看看詳細的介紹吧

一、不改變原數(shù)組,返回新數(shù)組(字符串)

1、concat()   連接兩個或者多個數(shù)組,兩邊的原始數(shù)組都不會變化,返回的是被連接數(shù)組的一個副本。

2、join()  把數(shù)組中所有的元素放入到一個字符串中,返回字符串

var a = [1,2,3];
a.join([4,5,6]); // "14,5,624,5,63"
a.join('sau');  // "1sau2sau3"

3、slice()    從開始到結(jié)束(不包括結(jié)束)選擇數(shù)組的一部分淺拷貝到一個新數(shù)組

var a = [1,2,3,4,5];
a.slice(0,0);  //[]
a.slice(0,1);  //[1]
a.slice(2,4); //[3,4]
a.slice(0,5); //[1,2,3,4,5]
a.slice(10,1); //[]
a.slice(4); //[5]

4、map()   創(chuàng)建一個新的數(shù)組并返回,其中新數(shù)組的每一個元素由調(diào)用原始數(shù)組中的每一個元素執(zhí)行提供的函數(shù)得來,原數(shù)組不變

5、every()  對數(shù)組中的每一個元素都執(zhí)行一次指定的回調(diào)函數(shù),直到回調(diào)函數(shù)返回false,此時every()返回false并不再繼續(xù)執(zhí)行,如果回調(diào)函數(shù)都對每一個元素都返回true,那么every()返回true。

6、some()  對數(shù)組中的每一個元素都執(zhí)行一次指定的回調(diào)函數(shù),直到回調(diào)函數(shù)返回true,此時some()返回true并不再執(zhí)行。如果回調(diào)函數(shù)對每一個元素都返回false,那么some()將返回false。

7、filter()   創(chuàng)建一個新數(shù)組,其中包含通過所提供函數(shù)實現(xiàn)的測試的所有元素。

二、改變原數(shù)組

1、forEach()   針對每一個元素執(zhí)行提供的函數(shù)。會修改原來的數(shù)組,不會返回執(zhí)行結(jié)果,返回undefined。

2、pop()   刪除數(shù)組最后一個元素,返回被刪除的元素的值,如果數(shù)組為空,則不改變數(shù)組,返回undefined。

3、push()   向數(shù)組末尾添加一個或多個元素,返回改變后數(shù)組的長度。

4、reverse()   顛倒數(shù)組中元素的位置,返回該數(shù)組的引用。

5、shift()   從數(shù)組中刪除第一個元素,改變原數(shù)組,并返回該元素的值。

6、unshift()   將一個或者多個元素添加到數(shù)組的開頭,并返回新數(shù)組的長度。

7、sort()   對數(shù)組的元素進行排序,返回數(shù)組。排序不一定是穩(wěn)定的。默認排序順序是根據(jù)字符串unicode碼點。

8、splice()   向數(shù)組中添加/刪除元素,然后返回被刪除的新數(shù)組()。

var a = [1,2,3,4,5];
a.splice(0,1);  //刪除從0位置開始的1個 返回[1] a為[2,3,4,5] 
a.splice(1,0,99) //在1的位置插入99 [2,99,3,4,5]
a.splice(1,1,88) //99替換為88 [2,88,3,4,5]

三、遍歷方法

1、獲取屬性名:for...in  和object.key()的區(qū)別

答:1、for in 遍歷對象可以枚舉的屬性名列表,包括[[prototype]]原型鏈;

2、Object.keys() 只查找屬性名是否在對象中,返回一個數(shù)組,包含所有可以枚舉的屬性名;

3、Object.getOwnPropertyNames()只查找屬性名是否在對象中,返回一個數(shù)組,包含所有的屬性名,不論是否可枚舉。

2、獲取屬性值: for... of 和object.values()

for of 語句:遍歷可迭代對象的可枚舉屬性值列表,包括[[propertype]]原型鏈;

object.values() :返回一個給定對象自身的所有可枚舉屬性的值,不包括原型鏈。

四、ES6語法Map鍵值對轉(zhuǎn)化為數(shù)組

new Map創(chuàng)建一個map

// new Map創(chuàng)建一個map
let map = new Map([[1,"one"], [2,"two"], [3,"three"]]);
map.set(4, "four");

// 獲取所有鍵值對
console.log("獲取key")
console.log([...map.keys()]) // 輸出[1, 2, 3, 4]

console.log("獲取value")
console.log([...map.values()]) // 輸出[one, two, three, four]

console.log("獲取map數(shù)組")
console.log([...map]) // 輸出[[1, "one"], [2, "two"], [3, "three"], [4, "four"]]

五、兩個升序的數(shù)組合并成一個升序數(shù)組

1、時間復(fù)雜度O(M+N),空間復(fù)雜度O(M+N)

function merge(left, right){
 let result = [],
  il  = 0,
  ir  = 0;

 while (il < left.length && ir < right.length) {
  result.push(left[il] < right[ir] ? left[il++] : right[ir++]);
console.log(result);
 }

 return result.concat(left.slice(il)).concat(right.slice(ir));
}

2、時間復(fù)雜度O(M+N),空間復(fù)雜度O(1)

 // m, n 是數(shù)組長度
function merge(left, m, right, n) {
 var i = m - 1, j = n - 1, writeIdx = m + n - 1;
 while (i >= 0 && j >= 0)
 left[writeIdx--] = left[i] > right[j]? left[i--] : right[j--];
 while (j >= 0)
 left[writeIdx--] = right[j--];
 return left;
}

六、數(shù)組重復(fù)問題

(一)數(shù)組去重

1、reduce方法

const distinct = arr => arr.sort().reduce( (init, current) => {
 
 if (init.length === 0 || init[init.length - 1] !== current) {
  init.push( current );
 }
 return init;
}, []);

let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
distinct(arr); // [1, 2, 3, 4, 5]

2、filter方法

const distinct = arr => arr.filter( (element, index, self) => {
 return self.indexOf( element ) === index;
});

let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
distinct(arr); // [1, 2, 3, 5, 4]

(二)排序數(shù)組去重

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
 
 if(!nums || nums.length == 0) return 0;
 
 let len = 0;
 for(let i = 1; i < nums.length; i++) {
  if (nums[len] != nums[i]) {
   nums[++ len] = nums[i];
  }
 }
 return len + 1;
};

(三)判斷數(shù)組是否存在重復(fù)

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var containsDuplicate = function(nums) {
 
 let hashMap = new Map();
 for(let i = 0; i < nums.length; i++) {
  
  if( hashMap.has(nums[i]) ) {
   return true;
  }
  
  hashMap.set(nums[i], 1);
 }
 
 return false;
};

七、兩個數(shù)組的交集

給定兩個數(shù)組,寫一個方法來計算它們的交集。

例如:

給定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

注意:1、出結(jié)果中每個元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個數(shù)組中出現(xiàn)的次數(shù)一致。2、

我們可以不考慮輸出結(jié)果的順序。

跟進:1、如果給定的數(shù)組已經(jīng)排好序呢?你將如何優(yōu)化你的算法?2、如果 nums1 的大小比 nums2 小很多,哪種方法更優(yōu)?3、如果nums2的元素存儲在磁盤上,內(nèi)存是有限的,你不能一次加載所有的元素到內(nèi)存中,你該怎么辦?

解法:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
 
 var map1 = new Map();
 var number = [];
 
 for(var i = 0; i < nums1.length; i++) {
  var map1Value = map1.get(nums1[i]);
  map1.set( nums1[i], ( map1Value ? map1Value : 0 ) + 1 );
 }
 
 for(var i = 0; i < nums2.length; i++) {
  if( map1.has(nums2[i]) && map1.get(nums2[i]) != 0 ) {
   number.push(nums2[i]);
   map1.set( nums2[i], map1.get(nums2[i]) - 1 );
  }
 }
 
 return number;
};

八、找出一個數(shù)組中只出現(xiàn)一次的數(shù)字

給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次。找出那個只出現(xiàn)了一次的元素。

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
 
 let number = 0;
 for(let i = 0; i < nums.length; i++) {
  number ^= nums[i];
 }
 return number;
};

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 在JavaScript中創(chuàng)建對象的可行方法小結(jié)

    在JavaScript中創(chuàng)建對象的可行方法小結(jié)

    在Web前端開發(fā)中,JavaScript是一門功能強大的語言,其核心之一便是對象的創(chuàng)建與操作,對象是JavaScript中數(shù)據(jù)結(jié)構(gòu)的重要組成部分,本文將深入探討JavaScript中創(chuàng)建對象的各種方法,并結(jié)合代碼示例和實際開發(fā)經(jīng)驗進行詳細講解,需要的朋友可以參考下
    2025-03-03
  • 理解Javascript_12_執(zhí)行模型淺析

    理解Javascript_12_執(zhí)行模型淺析

    大家有沒有想過,一段javascript腳本從載入瀏覽器到顯示執(zhí)行都經(jīng)過了哪些流程,其執(zhí)行次序又是如何。本篇博文將引出'javascript執(zhí)行模型'的概念,并帶領(lǐng)大家理解javascript在執(zhí)行時的處理機制。
    2010-10-10
  • ECMAScript中函數(shù)function類型

    ECMAScript中函數(shù)function類型

    這篇文章主要介紹了ECMAScript中函數(shù)function類型的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • JS彈出窗口代碼大全(詳細整理)

    JS彈出窗口代碼大全(詳細整理)

    如何利用網(wǎng)頁彈出各種形式的窗口,我想大家大多都是知道些的,但那種多種多樣的彈出式窗口是怎么搞出來的,平時利用業(yè)余時間整理了一些,需要的朋友可以參考一下
    2012-12-12
  • js判斷生效時間不得大于失效時間的思路及代碼

    js判斷生效時間不得大于失效時間的思路及代碼

    生效時間不得大于失效時間在一些推銷、優(yōu)惠方面還是比較實用的,接下來一起看下詳細的實現(xiàn)代碼,感興趣的朋友可以參考下哈,希望對你有所幫助
    2013-04-04
  • 使用javascript將時間轉(zhuǎn)換成今天,昨天,前天等格式

    使用javascript將時間轉(zhuǎn)換成今天,昨天,前天等格式

    這篇文章主要介紹了使用javascript將時間轉(zhuǎn)換成今天,昨天,前天等格式的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • Javascript的動態(tài)增加類的實現(xiàn)方法

    Javascript的動態(tài)增加類的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫avascript的動態(tài)增加類的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • JS深入學習之數(shù)組對象排序操作示例

    JS深入學習之數(shù)組對象排序操作示例

    這篇文章主要介紹了JS深入學習之數(shù)組對象排序操作,結(jié)合實例形式詳細分析了JavaScript數(shù)組對象排序相關(guān)實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • 網(wǎng)頁加載速度優(yōu)化技巧的方案詳解

    網(wǎng)頁加載速度優(yōu)化技巧的方案詳解

    這篇文章主要為大家介紹了網(wǎng)頁加載速度優(yōu)化技巧的方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-05-05
  • js判斷出兩個字符串最大子串的函數(shù)實現(xiàn)方法

    js判斷出兩個字符串最大子串的函數(shù)實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s判斷出兩個字符串最大子串的函數(shù)實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

黄龙县| 恩平市| 永泰县| 响水县| 克东县| 城步| 南昌市| 青铜峡市| 凌海市| 龙口市| 新竹县| 无锡市| 正宁县| 浦城县| 安溪县| 安新县| 剑河县| 武邑县| 遂平县| 水富县| 册亨县| 长顺县| 宣汉县| 布尔津县| 甘洛县| 扎赉特旗| 若羌县| 临高县| 墨脱县| 韶山市| 通城县| 嘉荫县| 邹平县| 上杭县| 收藏| 大洼县| 多伦县| 丰宁| 津市市| 土默特左旗| 睢宁县|