Convertir un tableau multidimensionnel en objet

J'ai un réseau 2d avec [32] [32] entrées. Et j'aimerais le convertir en quelque chose comme ceci:

[ 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"} } 

Donc, ce serait mon tableau:

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

Maintenant, j'ai essayé d'utiliser ceci:

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

Mais cela ne fonctionnait que pour le tableau externe, les tableaux internes n'étaient pas affectés:

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

Quel serait le moyen le plus court de faire cela correctement?

Vous pouvez itérer sur les éléments dans le tableau, puis reculer si l'élément situé est lui-même un tableau (vérifiez avec 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)); 

Il en résulte:

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

Voir un jsBin en cours d'exécution

Remarque: vous pouvez certainement le faire en moins de code mais moins de code n'est pas toujours meilleur!

Array.prototype.reduce() semble idéal pour cela. Vous pouvez faire comme suit:

 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); 

Vous pouvez utiliser cette fonction récursive en utilisant le code 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);