给出以下javascript对象结构,通常是firebase
返回的结构var data = {
'id1' : {
'fname' : 'value',
'lname' : 'value',
'things' : {
'thing1' : {
'brand' : 'value',
'name' : 'value'
},
'thing2' : {
'brand' : 'value',
'name' : 'value'
},
'thing3' : {
'brand' : 'value',
'name' : 'value'
}
}
},
'id2' : {
'fname' : 'value',
'lname' : 'value',
'things' : {
'thing1' : {
'brand' : 'value',
'name' : 'value'
},
'thing2' : {
'brand' : 'value',
'name' : 'value'
},
'thing3' : {
'brand' : 'value',
'name' : 'value'
}
}
}
};
如何将其转换为
[
{
'fname' : 'value',
'lname' : 'value,
'things' : [
{
'brand' : 'value',
'name' : 'value'
},
{
'brand' : 'value',
'name' : 'value'
},
{
'brand' : 'value',
'name' : 'value'
}
]
},
{
'fname' : 'value',
'lname' : 'value,
'things' : [
{
'brand' : 'value',
'name' : 'value'
},
{
'brand' : 'value',
'name' : 'value'
},
{
'brand' : 'value',
'name' : 'value'
}
]
}
]
请记住,嵌套对象可能比这更深。有许多实现将嵌套结构转换为数组,但我没有看到有人进行这种特定的转换。我已经绞尽脑汁一段时间了,而且只是非常接近,但尚未得到恰到好处。
我已经有了这个代码,它对“东西”等更深层次的对象没有做任何事情。
var collection = [];
for(key in data) {
collection.push(data[key]);
}
我正在努力让它递归。
修改 我想它需要包含在一个可以调用自身的函数中,以便它可以递归。
答案 0 :(得分:2)
Here's a solution that doesn't require knowing the keys, assuming that you want to convert every other level of nesting:
function toArrayOfObjects(obj) {
var collection = [];
for (key in obj) {
var value = obj[key];
if (typeof value === 'object' && !Array.isArray(value)) {
var childObj = {};
for (childKey in value) {
var childValue = value[childKey];
if (typeof childValue === 'object' && !Array.isArray(childValue)) {
childObj[childKey] = toArrayOfObjects(childValue);
} else {
childObj[childKey] = childValue;
}
}
collection.push(childObj);
} else {
collection.push(value);
}
}
return collection;
}
答案 1 :(得分:1)
Something like this should do the trick:
function convert(object, propNamesToConvert) {
var array = [];
Object.keys(object).forEach(function(key) {
array.push(visit(object[key], propNamesToConvert));
});
return array;
}
function visit(object, propNamesToConvert) {
var result = {};
Object.keys(object).forEach(function(key) {
var value = object[key];
if (typeof(value) === 'object') {
// objects are either 'things to be converted' or we need to traverse further down the rabbit hole
if (propNamesToConvert.indexOf(key) >= 0) {
value = convert(value, propNamesToConvert);
}
else {
value = visit(value, propNamesToConvert);
}
}
result[key] = value;
});
return result;
}
console.log(JSON.stringify(visit(data, ['things'])));
It could probably be shortened considerably, but this works. It would be way better to translate the hard-coded ['things']
into something that is less maintenance-prone.
var data = {
'id1' : {
'fname' : 'value',
'lname' : 'value',
'things' : {
'thing1' : {
'brand' : 'value',
'name' : 'value'
},
'thing2' : {
'brand' : 'value',
'name' : 'value'
},
'thing3' : {
'brand' : 'value',
'name' : 'value'
}
}
},
'id2' : {
'fname' : 'value',
'lname' : 'value',
'things' : {
'thing1' : {
'brand' : 'value',
'name' : 'value'
},
'thing2' : {
'brand' : 'value',
'name' : 'value'
},
'thing3' : {
'brand' : 'value',
'name' : 'value'
}
}
}
};
function convert(object, propNamesToConvert) {
var array = [];
Object.keys(object).forEach(function(key) {
array.push(visit(object[key], propNamesToConvert));
});
return array;
}
function visit(object, propNamesToConvert) {
var result = {};
Object.keys(object).forEach(function(key) {
var value = object[key];
if (typeof(value) === 'object') {
if (propNamesToConvert.indexOf(key) >= 0) {
value = convert(value, propNamesToConvert);
}
else {
value = visit(value, propNamesToConvert);
}
}
result[key] = value;
});
return result;
}
console.log(JSON.stringify(visit(data, ['things'])));
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
答案 2 :(得分:0)
var newData = [];
var dataKeys = Object.keys(data);
for(var i=0; i<dataKeys.length; i++)
{
newData.push(data[dataKeys[i]]);
}
&#13;