-2

我有一个如下所示的数组结构。我需要将其转换为不同的格式

 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;
                        }

我没有得到预期的答案,请有人帮我纠正这个问题。谢谢

这是没有语法错误的正确代码

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} 

谢谢

4

2 回答 2

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来说明它的工作原理。

于 2012-06-14T04:31:02.867 回答
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;
 }
}
于 2012-06-14T04:15:42.410 回答