麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

JavaScript實現數組降維詳解

2019-11-19 18:08:05
字體:
來源:轉載
供稿:網友

二維數組降維

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

遍歷降維

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', '!' ]

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

使用concat

利用concat方法,可以將雙重循環簡化為單重循環:

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的每一個元素都是一個數組或參數,作為concat方法的參數,數組中的參數或每一個子元素又都會被獨立插入進新數組。

使用apply+concat

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

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方法,只需要一行代碼就可以完成二維數組降維了。

多維數組降維

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

遞歸

Array.prototype.deepFlatten = function() {  var result = []; //定義保存結果的數組  this.forEach(function(val, idx) { //遍歷數組    if (Array.isArray(val)) { //判斷是否為子數組      val.forEach(arguments.callee); //為子數組則遞歸執行    } else {      result.push(val); //不為子數組則將值存入結果數組中    }  });  return result; //返回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' } ]

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

棧方法

Array.prototype.deepFlatten = function() {  var result = []; //定義保存結果的數組  var stack = this; //將數組放入棧中  while (stack.length !== 0) { //如果棧不為空,則循環遍歷    var val = stack.pop(); //取出最后一個值    if (Array.isArray(val)) { //判斷是不是數組      stack = stack.concat(val); //如果是數組就將拼接入棧中    } else {      result.unshift(val); //如果不是數組就將其取出來放入結果數組中    }  }  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' } ]

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费男女视频 | 亚洲影院在线 | av国产片 | 史上最强炼体老祖动漫在线观看 | 91精品国产九九九久久久亚洲 | 激情久久一区二区 | 免费看黄色一级片 | 91看片免费版 | 久久久鲁| 成人福利视频导航 | 一级免费黄色 | 91色琪琪电影亚洲精品久久 | 免费一区二区三区 | 国产孕妇孕交大片孕 | 亚洲午夜视频 | 激情小说图 | 国产精品久久久久久久久久久久久久久 | 精品xxxx户外露出视频 | 久久久久中精品中文字幕19 | 精品在线免费播放 | 久久久久久片 | 亚洲第一精品在线 | 美女av在线免费观看 | 日韩色视频在线观看 | 欧美一级黄色影院 | 操你啦免费视频 | 国产高潮失禁喷水爽到抽搐视频 | 毛片免费视频播放 | 黄色av片在线观看 | 亚洲视频成人 | 国产不卡av在线 | 亚洲欧美国产精品va在线观看 | 又黄又爽免费无遮挡在线观看 | 欧美一级精品 | 嫩草91在线| 欧美日韩在线免费观看 | 日日摸夜夜添夜夜添牛牛 | 中文字幕在线播放不卡 | 一日本道久久久精品国产 | 欧美国产日韩在线 | xxxx18韩国护士hd老师 |