1

与えられた配列を深く平坦化できる関数を記述したいと思います。たとえば:Javascriptの深い平面多次元配列

deepFlatten([]);   // [] 
deepFlatten([1, 2, 3]); // [1, 2, 3] 
deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]]); // [1, 2, 3, "a", "b", "c", 1, 2, 3] 
deepFlatten([[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]); // [3, 4, 5, 9, 9, 8, 1, 2, 3] 

私は再帰的にこの問題を解決しようとすると、これまでのところ、私はこれを持っている:

var deepFlatten = function (array){ 
    var result = []; 
    array.forEach(function (elem) { 
    if (Array.isArray(elem)) { 
     result.concat(deepFlatten(elem)); // problem probably lies here 
    } else { 
     result.push(elem); 
    } 
    }); 
    return result; 
}; 

は、しかし、これは結果として、非配列要素をプッシュするだけで、完全に連結する部分を無視します。これを修正するにはどうすればよいですか、または外部ライブラリの助けを借りずにこの関数を書く方が良いでしょうか?

答えて

4

あなただけの代わりに、あなたがreduce()を使用して、代わりに連結の構文を広げることができますresult = result.concat(deepFlatten(elem))

var deepFlatten = function (array){ 
 
    var result = []; 
 
    
 
    array.forEach(function (elem) { 
 
    if (Array.isArray(elem)) { 
 
     result = result.concat(deepFlatten(elem)); // Fix here 
 
    } else { 
 
     result.push(elem); 
 
    } 
 
    }); 
 
    
 
    return result; 
 
}; 
 

 
console.log(deepFlatten([]))  
 
console.log(deepFlatten([1, 2, 3])) 
 
console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]])) 
 
console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))

につながる設定する必要があります。

var deepFlatten = function (array){ 
 
    return array.reduce(function(r, e) { 
 
    return Array.isArray(e) ? r.push(...deepFlatten(e)) : r.push(e), r 
 
    }, []) 
 
}; 
 

 
console.log(deepFlatten([]))  
 
console.log(deepFlatten([1, 2, 3])) 
 
console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]])) 
 
console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))

2

あなたのコードは大部分が問題ありません。 .concatは新しい配列を返しますが、元の配列は変更されません。あなたが

result.concat(deepFlatten(elem)); // problem probably lies here 

変更する場合:

result = result.concat(deepFlatten(elem)); // problem probably lies here 

私はそれが正しい結果が得られると思います。