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