多維陣列轉一維陣列(降維的多種方式)

jsliang發表於2019-11-21

一 目錄

不折騰的前端,和鹹魚有什麼區別

目錄
一 目錄
二 前言
三 二維降一維
四 遞迴降維
五 flat() 降維
六 參考文獻

二 前言

返回目錄

在業務場景或者刷 LeetCode 的時候,曾經碰到多次碰到一個問題:

  • 如何將二維甚至多維的陣列轉換成一維陣列?

講起將多維轉成一維,突然想起一個詞叫做【降維打擊】,下面將這種二維甚至多維的打成一維陣列的方法,叫做【降維】

這篇文章和你一起探討下轉換的方法~

三 二維降一維

返回目錄

我們先來個簡單的:

  • 二維陣列如何降級成一維陣列?

很多時候,我們的陣列層次並沒有那麼深,只有個二維陣列,所以我們可以瞭解下一些快捷的使用方法。

reduce() 二維降一維

const oldArr = [1, 2, [3, 4]];

const newArr = oldArr.reduce((prev, curr) => (prev.concat(curr)), []);

console.log(newArr);
// [1, 2, 3, 4]
複製程式碼

concat() 二維將一維

const oldArr = [1, 2, [3, 4]];

const newArr = [].concat(...oldArr);
const newnewArr = Array.prototype.concat.apply([], oldArr);

console.log(newArr);
// [1, 2, 3, 4]
console.log(newnewArr);
// [1, 2, 3, 4]
複製程式碼

flat() 二維降一維

const oldArr = [1, 2, [3, 4]];

const newArr = oldArr.flat();

console.log(newArr);
// [1, 2, 3, 4]
複製程式碼

四 遞迴降維

返回目錄

既然二維降一維的小夥伴們看過之後,我們就可以進一步瞭解多維降一維陣列了。

我們先了解下通過遞迴降維。

關於遞迴降維,這裡有兩個方法:

  • forEach 遞迴
  • reduce 遞迴

下面一一分析:

forEach 遞迴降維

const oldArr = [
  1,
  [
    2, [3],
    [4, 5, 6],
    [7, 8, 9],
    10,
    11,
  ],
  12,
  13,
  14,
  [15, 16, 17],
];

const newArr = [];

const ergodic = (arr) => {
  arr.forEach((item) => {
    if (Array.isArray(item)) {
      ergodic(item);
    } else {
      newArr.push(item);
    }
  })
}

ergodic(oldArr, newArr);

console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
複製程式碼

Array.isArray() 用於確定傳遞的值是否是一個 Array,返回 true 或者 false

在這個遞迴方法中,我們判斷每一項是不是陣列。

如果是,則進一步遞迴,直到其不是為止。

如果不是,則用新陣列接收它。

reduce 遞迴降維

const oldArr = [
  1,
  [
    2, [3],
    [4, 5, 6],
    [7, 8, 9],
    10,
    11
  ],
  12,
  13,
  14,
  [15, 16, 17],
];

const ergodic = (arr) => arr.reduce((prev, curr, index, list) => {
  if (Array.isArray(curr)) {
    return prev.concat(...ergodic(curr));
  }
  return prev.concat(curr);
}, []);

const newArr = ergodic(oldArr);

console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
複製程式碼
  • 提問:請說出 reduce 對應的 4 個引數代表什麼?

五 flat() 降維

返回目錄

flat() 是 ES6 提供的一個將巢狀的陣列 “拉平” 的方法。

flat 降維

const oldArr = [
  1,
  [
    2, [3],
    [4, 5, 6],
    [7, 8, 9],
    10,
    11
  ],
  12,
  13,
  14,
  [15, 16, 17],
];

const newArr = oldArr.flat(Infinity);

console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
複製程式碼

關於 flat(),更多的可以查閱 MDN

或者檢視 阮一峰 大佬的 ES6 講解:

這裡大致講下這個方法:

  • 入參

arr.flat(depth)

這個 depth 即拉平幾層的意思,就好比:

// 二維陣列:預設拉平一層
[1, 2, [3, 4, [5]]].flat();
// [1, 2, 3, 4, [5]]

// 四維陣列:設定拉平兩層
[1, 2, [3, 4, [5, [6, 7]]]].flat(2);
// [1, 2, 3, 4, 5, [6, 7]]

// 設定拉平所有層
[1, 2, [3, 4, [5]]].flat(Infinity);
// [1, 2, 3, 4, 5]
複製程式碼
  • 注意事項

值得注意的是:使用 flat() 拉平陣列過程中,會移除陣列的空項:

[1, 2, , 4, 5].flat();
// [1, 2, 4, 5]
複製程式碼
  • 擴充套件瞭解

在你運用 flat() 自如的時候,不妨瞭解下它的同輩 flatMap()

flatMap() 方法首先使用對映函式對映每個元素,然後將結果壓縮成一個新陣列。

這裡不一一介紹,感興趣的可以瞭解下。

flatMap() 使用

const arr = [1, 2, 3, 4];

arr.flatMap(x => x * 2);
// [2, 4, 6, 8]

arr.flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]
複製程式碼

六 參考文獻

返回目錄

致敬在前端路上不斷探索的大佬們,本篇文章參考自:

  1. 《JavaScript 學習筆記 - 多維陣列變為一維陣列》 - MADAO是不會開花的
  2. 《es6--javascript陣列降維,從es5分析到es6,(詳解reduce方法)歡迎補充》 - 程式喵timy
  3. 《陣列例項的-flat,flatMap》 - 阮一峰
  4. 《Array.prototype.flat() - MDN

jsliang 廣告推送:
也許小夥伴想了解下雲伺服器
或者小夥伴想買一臺雲伺服器
或者小夥伴需要續費雲伺服器
歡迎點選 雲伺服器推廣 檢視!

多維陣列轉一維陣列(降維的多種方式)
多維陣列轉一維陣列(降維的多種方式)

知識共享許可協議
jsliang 的文件庫樑峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於github.com/LiangJunron…上的作品創作。
本許可協議授權之外的使用許可權可以從 creativecommons.org/licenses/by… 處獲得。

相關文章