2016-07-25 213 views
1

我有一個最多[32] [32]條目的2d數組。 我想從這樣的轉換:將多維數組轉換爲對象

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

{ 
    "6": {"10":"player1"}, 
    "7": {"5":"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

這個結構在現實中有點複雜。不僅僅是玩家。我想要的是簡單地將2d數組轉換爲使用數組索引作爲關鍵字的對象。這樣我可以擺脫數組的所有空值。 – 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

關於你的代碼的好處是,如果你在原始數組中放置對象而不是字符串,這並不會中斷。 – Forivin

3

Array.prototype.reduce()對此似乎很理想。你可以這樣做:

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,name:'Player1'}'而不是「player1」這樣的對象,那麼轉換後我無法再訪問該屬性。 – Forivin

+0

@Forivin ...對不起有一組額外的括號,我忽略了這是一個數組''「player1」]'而不是一個字符串''player1「''。現在應該沒問題。 – Redu

1

您可以使用此遞歸函數,使用ES6代碼:

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嵌套更深水平。它不要求非null元素位於其(子)數組的末尾,也不要求每個(子)數組只有一個非null元素。