I have a 2d array with up to [32][32] entries. And I'd like to convert it from something like this:
[
null,
null,
null,
null,
null,
null,
[null, null, null, null, null, null, null, null, null, null, "player1"],
[null, null, null, null, null, "player2"]
]
to
{
"6": {"10":"player1"},
"7": {"5":"player2"}
}
So this would be my array:
var gameField = [];
gameField[6] = [];
gameField[6][10] = "player1";
gameField[7] = [];
gameField[7][5] = "player2";
Now I tried to use this:
var obj = {}
obj = Object.assign({},gameField);
console.log(JSON.stringify(obj));
but it only worked for the outer array, the inner arrays were not affected:
{
"6": [null, null, null, null, null, null, null, null, null, null, "player1"],
"7": [null, null, null, null, null, "player2"]
}
What would be the shortest way to do this properly?
You can iterate over the items in the array and then recurse if the located item is itself an array (check using 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));
This results in:
[object Object] {
6: [object Object] {
10: "player1"
},
7: [object Object] {
5: "player2"
}
}
See a working jsBin
Note: you can certainly do this in less code but less code is not always better!
Array.prototype.reduce() seems ideal for this. You may do as follows;
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With