Na verdade, é muito fácil de fazer.
Dê a essa função uma matriz de objetos e ela os mesclará em um.
var merge = function(objects) {
var out = {};
for (var i = 0; i < objects.length; i++) {
for (var p in objects[i]) {
out[p] = objects[i][p];
}
}
return out;
}
Dê a esta função um objeto aninhado e isso a tornará de nível único
var flatten = function(obj, name, stem) {
var out = {};
var newStem = (typeof stem !== 'undefined' && stem !== '') ? stem + '_' + name : name;
if (typeof obj !== 'object') {
out[newStem] = obj;
return out;
}
for (var p in obj) {
var prop = flatten(obj[p], p, newStem);
out = merge([out, prop]);
}
return out;
};
Para usar, basta:
var myObject = {
name: 'fiiv',
birthYear: 1986,
favoriteColors: [ 'red', 'orange' ],
isWearing: {
shirt: {
color: 'white'
},
shorts: {
color: 'blue'
}
}
};
console.log(flatten(myObject));
E isso produz:
{
name: 'fiiv',
birthYear: 1986,
favoriteColors_0: 'red',
favoriteColors_1: 'orange',
isWearing_shirt_color: 'white',
isWearing_shorts_color: 'blue'
}