成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS數(shù)組專題1?? ? 數(shù)組扁平化

lieeps / 2600人閱讀

一、什么是數(shù)組扁平化

扁平化,顧名思義就是減少?gòu)?fù)雜性裝飾,使其事物本身更簡(jiǎn)潔、簡(jiǎn)單,突出主題。

數(shù)組扁平化,對(duì)著上面意思套也知道了,就是將一個(gè)復(fù)雜的嵌套多層的數(shù)組,一層一層的轉(zhuǎn)化為層級(jí)較少或者只有一層的數(shù)組。

Ps: flatten 可以使數(shù)組扁平化,效果就會(huì)如下:

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr)); // [1, 2, 3, 4]
從中可以看出,使用 flatten 處理后的數(shù)組只有一層,下面我們來(lái)試著實(shí)現(xiàn)一下。
二、簡(jiǎn)單實(shí)現(xiàn) 2.1 普通遞歸

這是最容易想到的方法,簡(jiǎn)單,清晰!

/* ES6 */
const flatten = (arr) => {
  let result = [];
  arr.forEach((item, i, arr) => {
    if (Array.isArray(item)) {
      result = result.concat(flatten(item));
    } else {
      result.push(arr[i])
    }
  })
  return result;
};

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
function flatten(arr) {
  var result = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flatten(arr[i]))
    }
    else {
      result.push(arr[i])
    }
  }
  return result;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.2 toString()

該方法是利用 toString 把數(shù)組變成以逗號(hào)分隔的字符串,然后遍歷數(shù)組把每一項(xiàng)再變回原來(lái)的類型。

先來(lái)看下 toString 是怎么把數(shù)組變成字符串的

[1, [2, 3, [4]]].toString()
// "1,2,3,4"

完整的展示

/* ES6 */
const flatten = (arr) => arr.toString().split(",").map((item) => +item);

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
function flatten(arr) {
  return arr.toString().split(",").map(function(item){
    return +item;
  });
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
這種方法使用的場(chǎng)景卻非常有限,必須數(shù)組中元素全部都是 Number
也可以全部都為 String,具體實(shí)現(xiàn)大家自己體會(huì)。
2.3 [].concat.apply + some

利用 arr.some 判斷當(dāng)數(shù)組中還有數(shù)組的話,循環(huán)調(diào)用 flatten 扁平函數(shù)(利用 [].concat.apply扁平), 用 concat 連接,最終返回 arr;

/* ES6 */
const flatten = (arr) => {
  while (arr.some(item => Array.isArray(item))){
    arr = [].concat.apply([], arr);
  }
  return arr;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
/**
* 封裝Array.some
* @param {function} callback    - 回調(diào)函數(shù)
* @param {any}      currentThis - 回調(diào)函數(shù)中this指向
*/
Array.prototype.some = function (callback, currentThis){
  let context = this;
  let flag = false;
  currentThis = currentThis || this;
  for (var i = 0, len = context.length; i < len; i++) {
    const res = callback.call(currentThis, context[i], i, context);
    if (res) {
      flag = true;
    } else if (!flag) {
      flag = false;
    }
  }
  return flag;
}

function flatten(arr){
  while(arr.some(item => Array.isArray(item))){
    arr = [].concat.apply([], arr);
  }
  return arr;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.4 reduce

reduce 本身就是一個(gè)迭代循環(huán)器,通常用于累加,所以根據(jù)這一特點(diǎn)有以下:

function flatten(arr){
  return arr.reduce(function(prev, cur){
    return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
  }, [])
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.5 ES6 中的 解構(gòu)運(yùn)算符 ...

... 每次只能展開最外層的數(shù)組,被 [].concat 后,arr 就扁平化一次。

function flatten(arr){
  while(arr.some(item => Array.isArray(item))){
    arr = [].concat(...arr);
  }
  return arr;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

番外篇將給大家講解 lodashflatten 的實(shí)現(xiàn)源碼,感謝大家閱讀!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96617.html

相關(guān)文章

  • JS數(shù)組專題2?? ? 數(shù)組去重

    距離上次發(fā)文,已經(jīng)有一段時(shí)間了,最近工作比較忙,這不眼看快雙十一了,就相當(dāng)于給大家一些福利吧! showImg(https://segmentfault.com/img/remote/1460000016538082?w=250&h=250); 一、什么是數(shù)組去重 簡(jiǎn)單說(shuō)就是把數(shù)組中重復(fù)的項(xiàng)刪除掉,你 GET 到了嗎 ?下面我將簡(jiǎn)單介紹下幾種基本的方法及其優(yōu)缺點(diǎn)。 二、方法匯總 兩層循環(huán) 無(wú)相同...

    tunny 評(píng)論0 收藏0
  • ?每日肥學(xué)?——算法&amp;面試題3??

    每日肥學(xué) 導(dǎo)讀?算法題一點(diǎn)點(diǎn)思路源碼和解析 ?面試題特別介紹 導(dǎo)讀 小伙伴們新的學(xué)期又要開始了,您是否已經(jīng)做好了沖刺的準(zhǔn)備了呢?如果您想在這個(gè)學(xué)期收獲的比別人更多我建議給肥肥點(diǎn)個(gè)關(guān)注。我們一起來(lái)增長(zhǎng)知識(shí),無(wú)論你是考研還是找工作或者是要加薪。這里都是一個(gè)不錯(cuò)的選擇。讓我們紅塵作伴,一起肥學(xué)!!! ?算法題 實(shí)現(xiàn)獲取 下一個(gè)排列 的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個(gè)更大的排列...

    biaoxiaoduan 評(píng)論0 收藏0
  • JavaScript數(shù)組函數(shù)

    摘要:如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之間的項(xiàng),但不包括結(jié)束位置的項(xiàng)。刪除刪除任意數(shù)量的項(xiàng),只需指定兩個(gè)參數(shù)要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。例如會(huì)刪除數(shù)組中的前兩項(xiàng)。和這兩個(gè)方法都接收兩個(gè)參數(shù)要查找的項(xiàng)和可選的表示查找起點(diǎn)位置的索引。 下面總結(jié)了一些JavaScript中常用的數(shù)組操作方法。驗(yàn)證是不是數(shù)組用 arr instanceof Array 或者Array.isArray...

    notebin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<