将一组对象反规范化为非规范化数组

时间:2014-02-26 17:00:19

标签: javascript

我正在尝试找到一种方法来对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);
    }
}

但有些事情没有按预期发挥作用

1 个答案:

答案 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