我正在尝试找到一种方法来对JavaScript中的对象数组进行反规范化以获取一组数组。我需要表的结构(非规范化数据集)。
所以,给出输入:
var data = [
{ v1: 1, v2: [ { a: 1 }, { a: 2 } ] },
{ v1: 2, v2: [ { a: 3 }, { a: 4 } ], v3: 5 },
];
我需要像
这样的结构var data2 = [
{ v1: 1, v2_a: 1 },
{ v1: 1, v2_a: 2 },
{ v1: 2, v2_a: 3, v3: 5 },
{ v1: 2, v2_a: 4, v3: 5 }
];
递归方式。
我的第一次尝试是深入进行全扫描搜索,在时间变量中添加属性:
var result = [];
function aArray(data) {
for(var i = 0; i < data.length; i++){
var temp = {};
for(var prop in data[i]){
var val = data[i][prop];
if( Object.prototype.toString.call( val ) === '[object Array]' ) {
aArray(val);
}else{
temp[prop] = val;
}
}
result.push(temp);
}
}
但有些事情没有按预期发挥作用
答案 0 :(得分:1)
您可以尝试此解决方案
var data = [
{ v1: 1, v2: [ { a: 1 }, { a: 2 } ] },
{ v1: 2, v2: [ { a: 3 }, { a: 4 } ], v3: 5 },
];
function is_a(a){
return (typeof a == "object") && (a instanceof Array);
}
function extend(a, b){
for(var i in b){
a[i] = b[i];
}
return a;
}
现在主要逻辑:
var p = data.map(function(item){
var output = {};
var list = [];
for(var i in item){
if(is_a(item[i])){
for(var j = 0; j < item[i].length; j++){
for(var z in item[i][j]){
var k = {}; k[i + "_" + z] = item[i][j][z];
list.push(k);
}
}
}
else{
output[i] = item[i];
}
}
for(var i = 0; i < list.length; i++){
list[i] = extend(list[i], output);
}
console.log(list);
});
输出: 首先
0:对象 v1:1 v2_a:1
1:对象 v1:1 v2_a:2
第二
0:对象 v1:2 v2_a:3 v3:5
1:对象 v1:2 v2_a:4 v3:5
尝试demo