重新组合javascript数组

时间:2012-06-07 18:45:04

标签: javascript jquery json

我有以下javascript数组与我

var test =[{
Maths:{
    ST1:10,
    ST2:2,
    ST3:15}
},
{
Science:{
    ST1:50,
    ST3:40}
    }
]

我想生成下面显示的数组

var t = [{ST1:{
               Maths:10,
               Science:50
              },
          ST2:{
               Maths:2,
               Science:0
              },
          ST3:{
               Maths:15,
               Science:40
              }
         }]

我尝试使用下面显示的代码

for (var key in test) {
  if (test.hasOwnProperty(key)) {
  for (var key1 in test[key]){
    //console.log(key1)}
    var abc = test[key][key1];
    for(var x in abc)
    {

    console.log(x+key1+abc[x])

    }

    }
  }
}

我是新手,帮助我这样做。

4 个答案:

答案 0 :(得分:1)

这主要是你想要的......

var t = {};
for (var i = 0; i < test.length; i++) {
    for (var name in test[i]) {
        for (var level in test[i][name]) {
            if (!t[level])
                t[level] = {}
            t[level][name] = test[i][name][level]
        }
    }
}

唯一缺少的是在某个部分下缺少Science:0值时获取STx

DEMO: http://jsfiddle.net/eHwBC/

结果:

{
    "ST1": {
        "Maths": 10,
        "Science": 50
    },
    "ST2": {
        "Maths": 2
    },
    "ST3": {
        "Maths": 15,
        "Science": 40
    }
}

请注意,使用for-in进行枚举时无法保证订单。

如果预先知道标签(数学,科学等),那么您可以确保每个对象都获得所有标签。

如果没有,可以进行单独的循环。根据方法,可以在此主循环之前或之后完成。

答案 1 :(得分:0)

您知道JSON.stringify(t)吗?

它会将对象文字转换为JSON。

Mozilla在https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify上提供了此功能的文档。

您还可以阅读this blog article以获取进一步说明

答案 2 :(得分:0)

尝试如下,

/* Iterator start */
var t = {};
for (var i = 0; i < test.length; i++) {  //Iterate Maths, Science,..   
    for (var key in test[i]) {           //Iterate Math
        for (var iKey in test[i][key]) { //Iterate ST1, ST2, ST3
          var s = (t.hasOwnProperty(iKey))?t[iKey]:createObject();                    
          s[key] = test[i][key][iKey];
          t[iKey] = s;
        }
    }
}
/* Iterator End */ 

p = [];
p.push(t);
//^- p is what you want

// Separate function so you can add more items later without changing logic
function createObject () {
    return {'Maths' : 0, 'Science': 0};
}

DEMO以及下面的证明,

enter image description here

答案 3 :(得分:0)

试试这个:

var test =[{
Maths:{
    ST1:10,
    ST2:2,
    ST3:15
    }
},
{
Science:{
    ST1:50,
    ST3:40}
    }
];

var result = [];
for(i = 0; i <= test.length; i++){
  var resultRow = {};
  for(key in test[i]){
    for(subKey in test[i][key]){
      if(resultRow[subKey] == undefined){
        resultRow[subKey] = {};
      }
      resultRow[subKey][key] = test[i][key][subKey];
    }
  }
  result.push(resultRow);
}