ホームページ  >  記事  >  ウェブフロントエンド  >  js配列のフラット化とは何ですか? js配列の平坦化の実装(コード付き)

js配列のフラット化とは何ですか? js配列の平坦化の実装(コード付き)

不言
不言オリジナル
2018-08-06 13:58:162437ブラウズ

この記事では、js 配列のフラット化とは何ですか? js 配列の平坦化の実装 (コード付き) は、必要な方は参考にしていただければ幸いです。

1. 配列のフラット化とは何ですか?

  1. フラット化とは、名前が示すように、複雑な装飾を減らし、物事をより簡潔かつシンプルにし、テーマを強調することです。

  2. 配列のフラット化は、上記の意味からすでにご存知のとおり、複雑なネストされた多層配列を層ごとに、より少ない層または 1 層のみの配列に変換することです。

追伸: flatten は配列を平坦化できます。その結果は次のようになります:

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr)); // [1, 2, 3, 4]
flatten 可以使数组扁平化,效果就会如下:
/* 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));

从中可以看出,使用 flatten 处理后的数组只有一层,下面我们来试着实现一下。

二、简单实现

2.1 普通递归

  • 这是最容易想到的方法,简单,清晰!

/* 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));
[1, [2, 3, [4]]].toString()
// "1,2,3,4"

2.2 toString()

  • 该方法是利用 toString 把数组变成以逗号分隔的字符串,然后遍历数组把每一项再变回原来的类型。

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

/* 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));
/* 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));

这种方法使用的场景却非常有限,必须数组中元素全部都是 Number。
也可以全部都为 String,具体实现大家自己体会。

2.3 [].concat.apply + some

  • 利用 arr.some 判断当数组中还有数组的话,循环调用 flatten 扁平函数(利用 [].concat.apply扁平), 用 concat 连接,最终返回 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));
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.4 reduce

  • reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:

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

2.5 ES6 中的 解构运算符 ...

  • ... 每次只能展开最外层的数组,被 [].concat 后,arr flatten で処理された配列には 1 つの層しかないことがわかります。試してみましょう。次にそれを実装します。

2. 簡単な実装

2.1 通常の再帰

    これは、シンプルで明確な、最も考えやすい方法です。
    🎜rrreeerrreee🎜🎜2.2 toString()🎜🎜
      🎜🎜このメソッドは、toString を使用して配列をカンマ区切りの文字列に変換します。次に、配列を反復処理して、各項目を元の型に戻します。 🎜🎜🎜🎜まず、toString が配列を文字列に変換する方法を見てみましょう🎜rrreee🎜完全表示🎜rrreeerrreee🎜このメソッドは非常に限られたシナリオで使用され、配列内のすべての要素はは数値です。
      すべて文字列にすることもでき、特定の実装を自分で実現することもできます。 🎜🎜🎜2.3 [].concat.apply + some🎜🎜
        🎜🎜 arr.some を使用して、配列内に配列があるかどうかを判断します。そしてループ内でそれを呼び出します flatten Flatten 関数 ([].concat.apply フラット化を使用)、concat を使用して接続し、最後に arr; 🎜🎜🎜rrreeerrreee🎜🎜2.4reduce🎜🎜
          🎜🎜reduce 自体は反復ルーパーであり、通常は累算に使用されます。 、この機能によると、以下: 🎜🎜🎜rrreee🎜🎜 ES6 2.5 の構造化演算子...🎜🎜
            🎜🎜... のみが可能一度に最大の拡張を行う 外側の配列が [].concat になった後、 arr が一度フラット化されます。 🎜🎜🎜rrreee🎜 おすすめ関連記事: 🎜🎜🎜JavaScriptを使用して四則演算コンパイラの字句解析を書く🎜🎜🎜🎜より多くのデータをロードするためにjsスクロールクリックを実装する方法? 🎜🎜🎜🎜

    以上がjs配列のフラット化とは何ですか? js配列の平坦化の実装(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。