2014-02-26 89 views
3

我试图找到一种方法来使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); 
    } 
} 

但预期

+2

你想为包含一个数组,它需要为嵌套数组,任何工作性质一般做这种扩张数组内?或者只是顶级的'v2'属性?它是否需要为嵌套在对象内部的对象工作,以便子对象在自己的世界中得到扩展? – jfriend00

+0

不能按预期工作的事情是,您在所需的输出数组中有4个对象,并且仅从输入数组创建2个对象。 – Tibos

+0

伙计。我正在尝试,但我没有更多的时间来完成它..你可能会尝试完成自己。看看[这个小提琴](http://jsfiddle.net/nPMcF/)。对不起.. =/ – DontVoteMeDown

回答

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

+0

递归方式。根据您的评论:http://jsfiddle.net/zFvZB/ 但仍然无法正常工作... – user3356809