JS数组专题1️⃣ ➖ 数组扁平化

一、什么是数组扁平化

  1. 扁平化,望文生义就是削减庞杂性装潢,使其事物自身更简约、简朴,突出主题。
  2. 数组扁平化,对着上面意义套也知道了,就是将一个庞杂的嵌套多层的数组,一层一层的转化为层级较少或许只要一层的数组。

Ps: flatten 能够使数组扁平化,结果就会以下:

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

从中能够看出,运用
flatten 处置惩罚后的数组只要一层,下面我们来试着完成一下。

二、简朴完成

2.1 一般递归

  • 这是最轻易想到的要领,简朴,清楚!
/* 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 把数组变成以逗号分开的字符串,然后遍历数组把每一项再变回本来的范例。

先来看下 toString 是怎样把数组变成字符串的

[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));

这类要领运用的场景却异常有限,必需数组中元素悉数都是
Number

也能够悉数都为
String,详细完成人人本身体味。

2.3 [].concat.apply + some

  • 应用 arr.some 推断当数组中另有数组的话,轮回挪用 flatten 扁平函数(应用 [].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    - 回调函数
* @param {any}      currentThis - 回调函数中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 自身就是一个迭代轮回器,一般用于累加,所以依据这一特性有以下:
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 中的 解构运算符 ...

  • ... 每次只能睁开最外层的数组,被 [].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 的完成源码,谢谢人人浏览!

    原文作者:亖巠
    原文地址: https://segmentfault.com/a/1190000015897703
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞