この記事では、js 配列のフラット化とは何ですか? js 配列の平坦化の実装 (コード付き) は、必要な方は参考にしていただければ幸いです。
1. 配列のフラット化とは何ですか?
フラット化とは、名前が示すように、複雑な装飾を減らし、物事をより簡潔かつシンプルにし、テーマを強調することです。
配列のフラット化は、上記の意味からすでにご存知のとおり、複雑なネストされた多層配列を層ごとに、より少ない層または 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🎜このメソッドは非常に限られたシナリオで使用され、配列内のすべての要素はは数値です。 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 サイトの他の関連記事を参照してください。