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

JavaScript實現(xiàn)數(shù)組降維詳解

 更新時間:2017年01月05日 10:03:20   作者:Mervyn Zhang  
大家都知道將多維數(shù)組(尤其是二維數(shù)組)轉(zhuǎn)化為一維數(shù)組是業(yè)務(wù)開發(fā)中的常用邏輯,除了使用樸素的循環(huán)轉(zhuǎn)換以外,我們還可以利用Javascript的語言特性和數(shù)據(jù)結(jié)構(gòu)的思想實現(xiàn)更為簡潔優(yōu)雅的轉(zhuǎn)換。下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)關(guān)于JavaScript如何實現(xiàn)數(shù)組降維吧。

二維數(shù)組降維

二維數(shù)組只有兩個維度,降維比較簡單,也不用考慮太復(fù)雜的算法邏輯,我們看一下二維數(shù)組降維的幾種方法;

遍歷降維

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0; r < arr.length; r++) {
  for (var c = 0; c < arr[r].length; c++) {
    result.push(arr[r][c]);
  }
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

此方法思路簡單,利用雙重循環(huán)遍歷二維數(shù)組中的每個元素并放到新數(shù)組中。

使用concat

利用concat方法,可以將雙重循環(huán)簡化為單重循環(huán):

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0, result = []; r < arr.length; r++) {
  result = result.concat(arr[r]);
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

arr的每一個元素都是一個數(shù)組或參數(shù),作為concat方法的參數(shù),數(shù)組中的參數(shù)或每一個子元素又都會被獨立插入進新數(shù)組。

使用apply+concat

apply方法會調(diào)用一個函數(shù),apply方法的第一個參數(shù)會作為被調(diào)用函數(shù)的this值,apply方法的第二個參數(shù)(一個數(shù)組,或類數(shù)組的對象)會作為被調(diào)用對象的arguments值,也就是說該數(shù)組的各個元素將會依次成為被調(diào)用函數(shù)的各個參數(shù);

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = Array.prototype.concat.apply([], arr);
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

利用apply方法,只需要一行代碼就可以完成二維數(shù)組降維了。

多維數(shù)組降維

多維數(shù)組就沒二維數(shù)組那么簡單了,因為不確定數(shù)組的深度,所以也不能進行遍歷來降維,只能通過遞歸或者棧方法來實現(xiàn)。

遞歸

Array.prototype.deepFlatten = function() {
  var result = []; //定義保存結(jié)果的數(shù)組
  this.forEach(function(val, idx) { //遍歷數(shù)組
    if (Array.isArray(val)) { //判斷是否為子數(shù)組
      val.forEach(arguments.callee); //為子數(shù)組則遞歸執(zhí)行
    } else {
      result.push(val); //不為子數(shù)組則將值存入結(jié)果數(shù)組中
    }
  });
  return result; //返回result數(shù)組
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

這是通過遞歸的方法實現(xiàn)了多維數(shù)組的降維,在這里面,我有使用了原型鏈將方法封裝進了Array原型中,可以直接在數(shù)組方法中調(diào)用。

棧方法

Array.prototype.deepFlatten = function() {
  var result = []; //定義保存結(jié)果的數(shù)組
  var stack = this; //將數(shù)組放入棧中
  while (stack.length !== 0) { //如果棧不為空,則循環(huán)遍歷
    var val = stack.pop(); //取出最后一個值
    if (Array.isArray(val)) { //判斷是不是數(shù)組
      stack = stack.concat(val); //如果是數(shù)組就將拼接入棧中
    } else {
      result.unshift(val); //如果不是數(shù)組就將其取出來放入結(jié)果數(shù)組中
    }
  }
  return result;
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

這是通過棧方法,建立了一個棧,將數(shù)組的內(nèi)容存進去,然后逐個取出來,如果取出來的是個數(shù)組,就將這個數(shù)組打散拼接進棧中,在出棧一個,這樣循環(huán)。

多維數(shù)組降維的方法也可以降維二維數(shù)組,但是有點大材小用,還是用對的方法做對的事才是最好的!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • JavaScript獲取上傳進度的幾種方式實現(xiàn)

    JavaScript獲取上傳進度的幾種方式實現(xiàn)

    進度條的應(yīng)用是為了顯示的告訴用戶文件上傳了多少,本文主要介紹了JavaScript獲取上傳進度的幾種方式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • JavaScript實現(xiàn)讀取與輸出XML文件數(shù)據(jù)的方法示例

    JavaScript實現(xiàn)讀取與輸出XML文件數(shù)據(jù)的方法示例

    這篇文章主要介紹了JavaScript實現(xiàn)讀取與輸出XML文件數(shù)據(jù)的方法,結(jié)合實例形式分析了JavaScript基于ActiveXObject實現(xiàn)載入、讀取與輸出xml文件數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • JavaScript cookie與session的使用及區(qū)別深入探究

    JavaScript cookie與session的使用及區(qū)別深入探究

    這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-10-10
  • 微信小程序開發(fā)之錄音機 音頻播放 動畫實例 (真機可用)

    微信小程序開發(fā)之錄音機 音頻播放 動畫實例 (真機可用)

    這篇文章主要介紹了微信小程序開發(fā)之錄音機 音頻播放 動畫實例 (真機可用),這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2016-12-12
  • 初步使用bootstrap快速創(chuàng)建頁面

    初步使用bootstrap快速創(chuàng)建頁面

    初步嘗試使用Express搭建了一個Web框架,那么接下來就是要在該框架下寫上自己的頁面,快速創(chuàng)建頁面這里選擇了bootstrap前端框架,通過它即使你不太懂前端設(shè)計,寫出來的頁面也不會太難看,感興趣的小伙伴們可以參考一下
    2016-03-03
  • js實現(xiàn)從左向右滑動式輪播圖效果

    js實現(xiàn)從左向右滑動式輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)從左向右滑動式輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    這篇文章主要介紹了JavaScript 正則應(yīng)用,結(jié)合實例形式詳細(xì)分析了JavaScript 正則表達(dá)式模式、欲查、反向引用等相關(guān)概念、原理與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • JavaScript錯誤處理之分析 Uncaught(in promise) error的原因及解決方案

    JavaScript錯誤處理之分析 Uncaught(in promise) error的

    在開發(fā)過程中,JavaScript的錯誤處理是一個老生常談的話題,當(dāng)應(yīng)用程序發(fā)生未捕獲的異常時,Uncaught(in promise) error是其中最常見的錯誤類型,這篇文章將從多個方面詳細(xì)闡述這種錯誤類型的原因與解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • JS實現(xiàn)的找零張數(shù)最小問題示例

    JS實現(xiàn)的找零張數(shù)最小問題示例

    這篇文章主要介紹了JS實現(xiàn)的找零張數(shù)最小問題,涉及javascript數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • 詳解JavaScript引擎V8執(zhí)行流程

    詳解JavaScript引擎V8執(zhí)行流程

    本文主要講解的是V8的技術(shù),是V8的入門篇,主要目的是了解V8的內(nèi)部機制,希望對前端,快應(yīng)用,瀏覽器,以及nodejs同學(xué)有些幫助。這里不涉及到如何編寫優(yōu)秀的前端,只是對JS內(nèi)部引擎技術(shù)的講解
    2021-06-06

最新評論

定边县| 周宁县| 石家庄市| 镇安县| 分宜县| 台东市| 波密县| 安图县| 无为县| 湟中县| 通海县| 承德县| 东源县| 滨海县| 揭东县| 阿克陶县| 通山县| 尚义县| 沧州市| 江阴市| 唐山市| 南木林县| 武定县| 周宁县| 垣曲县| 清苑县| 衡南县| 集贤县| 芒康县| 克东县| 仁寿县| 卓尼县| 台州市| 法库县| 界首市| 鞍山市| 思南县| 司法| 依兰县| 江达县| 广元市|