2016-08-26 5 views
0

JavaScriptの初心者ですが、最近この問題が発生しました。私は、アレイ持っている - (forループを使用して答える必要が)JavaScriptの多次元ネスト配列、単一配列でソート

var array_input = [1,2, [1,2,3], [4,5,6, [9,8,10]]]; 

をし、私は同じように、以下の次の配列のうちの希望:

var array_output = [1,2,3,4,5,6,7,8,9,10] 
+1

今まで何を試しましたか? –

+0

私は初心者で、何も考えていません... –

+1

これは平らな部分です:http://stackoverflow.com/questions/10865025/merge-flatten-an-array-of-arrays-in-javascript –

答えて

0
var array_input = [1,2, [1,2,3], [4,5,6, [9,8,10]]]; 
console.log(array_input.join().split(',').map(Number)); 

あなたは上記を使用することができます... https://jsfiddle.net/vp9kq3a8/

+0

うわー、私はそのような再帰的結合であることを知らなかった。ありがとう! –

1

いいえ私は、さまざまなソースからさまざまな種類のものを使用しています。最初に配列を凝縮すると、@ Thalaivarの答えがそれを釘付けます。

var array_input = [1,2, [1,2,3], [4,5,6, [9,8,10]]]; 
var pArray = array_input.join().split(',').map(Number); 

その後、using this answer広告若干の変更(番号のソートを実装する)、我々はすべての重複を削除します、それを仕分けしながら、アレイを形成:

function uniqSort(a) { 
    return a.sort(function sortNumber(a,b) { 
     return a - b; 
    }).filter(function(item, pos, ary) { 
     return !pos || item != ary[pos - 1]; 
    }) 
} 

それからちょうどその関数を呼び出します。

var array_output = uniqSort(pArray); 
2

あなたは結果を平らにするために一緒に再帰関数で、このためにSetを使用して、最終的に基本的なソートに適用できます。

function getValues(arr) { 
 
    return [...arr.reduce((acc, val) => 
 
    new Set([...acc, ...(Array.isArray(val) ? getValues(val) : [val])]), [])]; 
 
} 
 
// Sample input 
 
var array_input = [2,1, [1,3,2], [4,5,6, [9,8,10]]]; 
 
// Get values and sort them 
 
var result = getValues(array_input).sort((a,b) => a-b); 
 
// Show output 
 
console.log(result);

オブジェクトのキーを代替

キーを値として使用するオブジェクトでも同じ原則を使用できますが、私はt彼はSet道。オブジェクトキーは、(彼らは数値の場合)番号順に繰り返されると、明示的なソートのステップは、ここで必要とされていません。

function getValuesAsKeys(arr) { 
 
    return arr.reduce((acc, val) => 
 
    Object.assign(acc, Array.isArray(val) ? getValuesAsKeys(val) : { [val]: val }), {}); 
 
} 
 

 
// Sample input 
 
var array_input = [2,1, [1,3,2], [4,5,6, [9,8,10]]]; 
 
// Get values and sort them 
 
var result = Object.values(getValuesAsKeys(array_input)); 
 
// Show output 
 
console.log(result);

NB:Object.values方法は、この瞬間はほとんどサポートであります。 Object.keys(getValues(array_input)).map(Number)はこのオブジェクトの代わりに使用できますが、キーは値ですが、文字列型です(もちろん)。文字列に配列を変換する

数字列番号の代わり

は別の可能性ですが、私は本当に最後に、あなたが数字ではなく文字列を必要とするとき、変換を実行するために好きではありません。

+0

私はこのようなコードを書くとき(私はスニペット1を意味する)私は私のコードはまだ維持可能ではないと批判を受けるが、私はそれが完全にだと思う。あなたの解決策は素晴らしいですが、他方では、同じレベルで重複を扱う方法についての質問は明らかではありません。とにかく...私は書かれているべきであるようにコードを書いて人々を投票することに決めました。 – Redu