2016-07-25 2 views
1

Я в принципе хочет сделать это в обратном порядке: Convert multidimensional array to objectПреобразовать объект multidimensinal массива

Так скажем, у меня есть объект вроде этого:

{ 
    "6": {"10":{'id':0,'name':'player1'}}, 
    "7": {"5":{'id':1,'name':'player2'}} 
} 

Как я могу преобразовать, что в легальный массив, как это :

[ 
    null, 
    null, 
    null, 
    null, 
    null, 
    null, 
    [null, null, null, null, null, null, null, null, null, null, {'id':0,'name':'player1'}], 
    [null, null, null, null, null, {'id':1,'name':'player2'}] 
] 

Это код, который я успешно используется для преобразования его в другую сторону вокруг:

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

Numbers поскольку имена атрибутов обычно не являются величайшей идеей. – Damiano

+1

Технически это уже законный массив. 'obj [7] [5]' возвращает '{id: 1, name:" player2 "}'. Единственная разница, я думаю, заключается в том, что вместо «null» все незарегистрированные позиции массива «undefined». –

+0

Ну, я хочу, чтобы пройти через предмет, не получая ошибок или проверки на неопределенный. Atm obj [0] [0] через ошибку, не так ли? – Forivin

ответ

1
function objectToArray(obj) { 
    var len = Math.max.apply(null, Object.keys(obj)); 
    if (len !== len) return obj; // checking if NaN 

    var output = []; 
    for (var i = 0; i <= len; i++) { 
    output[i] = null; 
    if (obj[i]) { 
     output[i] = objectToArray(obj[i]); 
    } 
    } 
    return output; 
} 
1
var obj = { 
    "6": {"10":{'id':0,'name':'player1'}}, 
    "7": {"5":{'id':1,'name':'player2'}} 
}; 

function populateArray(obj) { 
    var range = 0, 
     arr = []; 

    for (var index in obj) { 
    range = Math.max(parseInt(index), range); 
    } 

    for (var i = 0; i <= range; i++) { 
    if (obj[i+'']) { 
     arr[i] = populateArray(obj[i+'']); 
    } else { 
     arr[i] = null; 
    } 
    } 

    return arr; 
} 

console.log(populateArray(obj)) 
1

Основываясь на вашем other question, предполагая, что источник является JSON, вы можете использовать реанимировать функцию, а для преобразования данных непосредственно при разборе

var json = '{ "6": {"10":{"id":0, "name":"player1"}}, "7": {"5":{"id":1,"name":"player2"}}}'; 
 

 
function reviver(key,val){ \t 
 
\t if(isNaN(key) || val.id !== undefined) 
 
    \t return val; 
 
    var res = []; 
 
    for(var p in val) 
 
     res[p] = val[p]; 
 
    return res; 
 
} 
 

 
var gameField = JSON.parse(json, reviver); 
 
console.log(gameField);

Смежные вопросы