2016-07-25 5 views
1

私は[32] [32]個までの2次元配列を持っています。 そして、私はこのようなものから、それを変換したい:これは私の配列になり多次元配列をオブジェクトに変換する

{ 
    "6": {"10":"player1"}, 
    "7": {"5":"player2"} 
} 

[ 
    null, 
    null, 
    null, 
    null, 
    null, 
    null, 
    [null, null, null, null, null, null, null, null, null, null, "player1"], 
    [null, null, null, null, null, "player2"] 
] 

var gameField = []; 
gameField[6] = []; 
gameField[6][10] = "player1"; 
gameField[7] = []; 
gameField[7][5] = "player2"; 

は今、私はこれを使用しようとしました:

var obj = {} 
obj = Object.assign({},gameField); 
console.log(JSON.stringify(obj)); 

それが唯一の外側の配列のために働いたが、内側の配列は影響を受けなかった。

{ 
    "6": [null, null, null, null, null, null, null, null, null, null, "player1"], 
    "7": [null, null, null, null, null, "player2"] 
} 

これを適切に行うための最短の方法でしょうか?

+0

達成しようとしていることを説明できますか? – Rajesh

+1

これは、*や*の後の非常に悪い構造のようです。動的オブジェクトキーはほとんど使用するのが難しいです。なぜあなたは例えば '{{player: 'player1'、numberOfX:10}、{player: 'player2'、numberOfX:5} 'のようなクリーナーを使用しないのですか? – str

+0

構造は現実には少し複雑です。ただの選手以上のものがあります。私が達成したいのは、2次元配列をキーとして配列インデックスを使用するオブジェクトに変換することだけです。そのため、配列のすべてのヌル値を取り除くことができます。 – Forivin

答えて

4

あなたは、アレイ内の項目を反復して、ある項目が配列そのものである場合には再帰することができます(Array.isArrayを使用して確認してください)

function populateFromArray(array) { 
    var output = {}; 
    array.forEach(function(item, index) { 
    if (!item) return; 
    if (Array.isArray(item)) { 
     output[index] = populateFromArray(item); 
    } else { 
     output[index] = item; 
    } 
    }); 
    return output; 
} 

console.log(populateFromArray(input)); 

これは、その結果:

[object Object] { 
    6: [object Object] { 
    10: "player1" 
    }, 
    7: [object Object] { 
    5: "player2" 
    } 
} 

working jsBinを参照してください。

注:これは確かに少ないコードで行うことができますが、少ないコードでは必ずしも良いとは限りません。

+0

ニース、それは動作します。あなたは "少ないコード"のことについて少し詳しく説明できますか? – Forivin

+0

@reduから答えが見える場合は、完璧な例があります。これははるかに少ないコードですが、私の意見では、理解するのがはるかに難しいです。 –

+0

コードの良い点は、元の配列に文字列の代わりにオブジェクトを配置した場合、isが壊れないことです。 – Forivin

3

Array.prototype.reduce()これは理想的です。あなたは次のようにすることができます。

var data = [null,null,null,null,null,null,[null,null,null,null,null,null,null,null,null,null,"player1"],[null,null,null,null,null,"player2"]]; 
 

 
function convert(data) { 
 
    return Array.isArray(data) 
 
     ? data.reduce((obj, el, i) => (el && (obj[i] = convert(el)), obj), {}) 
 
     : data; 
 
} 
 

 
var obj = convert(data); 
 

 
console.log(obj);

これはまた、あなたの入力配列が2よりも深くネストされたときに動作します:

var dataArr = [null,null,null,null,null,null,[null,null,null,null,null,null,null,null,null,null,"Player1"],[null,null,null,null,null,"player2"]], 
 
    dataObj = dataArr.reduce((p,c,i) => (Array.isArray(c) && (p[i] = {[c.length-1]:c[c.length-1]}),p),{}); 
 
console.log(dataObj);

+0

きちんと、私はそれが大好き! – Forivin

+0

けれども、私はのようなオブジェクトを使用する場合、 '{ID:0、名前:「Player1」}'ではなく「player1」の、私は変換後にもうプロパティにアクセスすることはできません。 – Forivin

+0

@Forivinは...申し訳ありませんが、配列 '[「player1」]'の代わりに文字列 '「player1を」'結果ました私が見落とし括弧の余分なセットがありました。今それは大丈夫でしょう。 – Redu

1

あなたはES6コードを使用して、この再帰関数を使用することができますレベル。 null以外の要素がその(サブ)配列の最後にあることを要求したり、(サブ)配列に対してnull以外の要素が1つしかないことはありません。

関連する問題