2012-06-14 155 views
-2

我有一个像下面的数组结构。我需要在转换为不同的格式Javascript阵列结构

test = [ 
    S1 { 
     science : 90 
    } 
    S2 
    { 
     Science:80, 
     Maths :56 
    } 
    ] 

我有拥有所有的科目如下

Subjects { 
    Science : 0 
    Maths :0 
    English:0 
    } 

我想我上面的数组转换到下面的结构数组

S1 { 
science : 90, 
Maths :0, 
English:0 

} 
S2 
{ 
Science:80, 
Maths :56, 
English:0 
} 

这意味着如果主题不可用我想输入一个键值对为0

我试过以下

for (var i = 0; i < test.length; i++) { 
         for (var key in test[i]) { 
        for (var iKey in test[i][key]) { 
       varr s = (t.hasOwnProperty(iKey)) ? t[iKey] : createSubjects(); 
       s[key] = test[i][key][iKey]; 
       t[iKey] = s; 
          } 
         } 
        } 

    function createSubjects(){ 
          var obj = []; 
          //categoryArray 

          for (var a = 0, l = Subjects a < l; ++a) { 

           obj[Subjects [a]] = 0; 
         } 

         return obj; 
         } 

我没有得到预期的答案,请有人帮我纠正这一点。由于

这里是corect代码不用其他的语法错误

var test = [ 
    S1 = { 
    science : 90 

    }, 
S2 = 
{ 
    Science:80, 
    Maths :56 
} 
] 

var Subjects = { 
Science : 0, 
Maths :0, 
English:0 
} 
function createSubjects(){ 
return {'Maths' : 0, 'Science': 0,'English':0} 
} 


var t = {} 
console.log(createSubjects()) 
for (var i = 0; i < test.length; i++) { 
    for (var key in test[i]) 
    { 
      var s = (t.hasOwnProperty(key)) ? t[key] : createSubjects(); 
      console.log(s) 
    } 
} 

我所得到的是 Object { Maths=0, Science=0, English=0}的所有类型。但是,我需要的是

Object { Maths=0, Science=90, English=0} 
Object { Maths=56, Science=80, English=0} 

感谢

+0

你期望什么?你真正看到的是什么? – David

+0

对于初学者,您有许多语法错误。你的数组定义和for循环语句是两个问题可能出现的地方。 –

+0

您需要了解JavaScript数组和对象的基础知识。您需要的输出不是有效的JavaScript。 – erturne

回答

0

如果我正确地理解你的问题,这应该工作。

marks = [ s1 = { science : 90 }, s2 = { science : 80, maths : 56 } ]; 
for (var i = 0; i< marks.length; i++) { 
if(!(marks[i].hasOwnProperty("science"))){ 
    marks[i].science = 0; 
} 

if(!(marks[i].hasOwnProperty("maths"))){ 
    marks[i].maths = 0; 
} 

if(!(marks[i].hasOwnProperty("english"))){ 
    marks[i].english = 0; 
} 
} 
+0

当数组索引中的对象具有该属性时,您的实现不会添加值。 – tjscience

+0

@tjscience多数民众赞成他期待知道吗?如果它没有带主题名称的属性并标记它,则将主题名称和标记添加为0? – Shreedhar

+0

他要求从一个数组转换为另一个数组,而不是简单地为不存在的属性添加零值。 – tjscience

1

这就是我想出来的。与原来的对象数组开始(与语法固定):

var test = [ 
    { 
     "Science": 90 
    }, 
    { 
     "Science": 80, 
     "Maths": 56 
    } 
]; 

然后你期望的输出(模板):

var template = { 
    "Science" : 0, 
    "Maths": 0, 
    "English": 0 
}; 

下面是可以转换的原始阵列获得所有的该模板的属性,如果他们不存在(各种各样的合并):

function convertArray(r, t) { 
    for (var i = 0, l = r.length; i < l; i++) { 
     tp_loop: 
     for (var tp in t) { 
      for (var rp in r[i]) { 
       if (!r[i].hasOwnProperty(tp)) { 
        r[i][tp] = t[tp]; 
        continue tp_loop; 
       } 
      } 
     } 
    } 
} 

用法:

convertArray(test, template); 

下面是一个简化的JSFiddle来说明它的工作原理。