JS配列の偏平化
2389 ワード
本当は書きたくないので、考えて書いてみましょう.
配列の平準化とは、多次元配列を1次元配列に変え、JSで配列の平準化を実現する方法には様々な種類があります.多くの話をしないでコードを見てください.
方法1、基本的なforサイクル+再帰
例えば[].concat(...arr)は、多次元配列を平坦化することができる.
これはES 6が提供する配列平準化法である.使い方も簡単です.新しい配列を返します.
flatのシンプルな実現
flat()の互換性はまだ低いので、もっと低い文法で手動で実現してもいいです.
配列の平準化とは、多次元配列を1次元配列に変え、JSで配列の平準化を実現する方法には様々な種類があります.多くの話をしないでコードを見てください.
方法1、基本的なforサイクル+再帰
var arr = [1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]];
function arrFlat(arr){
var temp = [];
for(var i=0; i
方法2、toString()let arr = [1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]];
console.log(arr.toString()) //"1,2,3,4,5,6,7,9,10,11,12"
arr = arr.toString().split(',').map(item => Number(item))//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
方法3、JSON.strigify()let arr = [1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]];
JSON.stringify(arr) //"[1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]]"
JSON.stringify(arr).replace(/(\[|\])/g, '') //"1,2,3,4,5,6,7,8,9,10,11,12"
arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(item => Number(item));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
方法4、concat()+…演算子例えば[].concat(...arr)は、多次元配列を平坦化することができる.
let arr = [1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]];
console.log([].concat(...arr)) //[1, 2, 3, 4, 5, [6, 7, [8, 9]], 10, 11, 12]
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr)
}
console.log(arr) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
方法5、flat()これはES 6が提供する配列平準化法である.使い方も簡単です.新しい配列を返します.
let arr = [1,2,[3,4,5,[6,7,[8,9]]],10,[11,12]];
arr = arr.flat() //[1, 2, 3, 4, 5, [6, 7, [8, 9]], 10, 11, 12]
arr = arr.flat(2) //[1, 2, 3, 4, 5, 6, 7, [8, 9], 10, 11, 12]
arr = arr.flat(Infinity) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
flatのシンプルな実現
flat()の互換性はまだ低いので、もっと低い文法で手動で実現してもいいです.
/**
* @param {number} n , 1
*/
function myFlat(n){
var temp = [];
n = (n === 'infinity' || !isNaN(n)) ? n : 1; // , 1
var m = 0;
function fn(arr){
if(n !== 'infinity'){
// n ,
if(m > n){
temp.push(arr);
return m = 1;
}
m++;
}
for(var i=0; i