我遇到了一些麻烦:
我需要将一些JSON列表的值放入一个单独的JSON对象中。我有一个包含数据行和JSON对象的JSON列表。我想遍历列表并将行映射到JSON中的不同对象。
第一个和最后一个元素是空的,然后有一些有限数量的名字,每个名字后跟一个无限数量的夫妻“日期”,“投票”(参见pastebin以便更好地理解)。
然后,我希望将列表中某个名称下的所有投票收集到JSON中的该对象。
我如何在javascript中做到这一点?我应该改变JSON的结构吗?
那是json:
{
"materie": [
{
"elettrotecnica_ed_elettronica": {
"voti": []
}
},
{
"lingua_e_letteratura_italiana": {
"voti": []
}
},
{
"lingua_inglese": {
"voti": []
}
},
{
"matematica_e_complementi_di_matematica": {
"voti": []
}
},
{
"scienze_motorie_e_sportive": {
"voti": []
}
},
{
"sistemi_automatici": {
"voti": []
}
},
{
"storia": {
"voti": []
}
},
{
"tecnologie_e_progettazione_di_sistemi_elettrici_ed_elettronici": {
"voti": []
}
}
]
}
那就是数组:
[ '',
'elettrotecnica ed elettronica',
'10',
'7½',
'8½',
'5',
'9',
'7',
'4',
'7-',
'7+',
'6',
'7½',
'lingua e letteratura italiana',
'6½',
'5+',
'6',
'7+',
'5',
'6½',
'lingua inglese',
'6+',
'7',
'7-',
'7½',
'7',
'7+',
'matematica e complementi di matematica',
'4½',
'9½',
'7',
'6½',
'9',
'7½',
'4',
'9',
'7½',
'7',
'8',
'8',
'scienze motorie e sportive',
'5',
'7',
'6',
'9',
'7',
'10',
'8',
'10',
'7',
'sistemi automatici',
'8',
'8½',
'10',
'10',
'8½',
'9½',
'10',
'10',
'10',
'9-',
'storia',
'4',
'6',
'5½',
'tecnologie e progettazione di sistemi elettrici ed elettronici',
's',
'7-',
'7',
'8',
'8-',
'7+',
'7½',
'6',
'6',
'8',
'6+',
'7-',
'7-',
'6',
'7',
'6',
'8½',
'' ]
答案 0 :(得分:0)
如果我理解正确,你只想解析包含名称和投票的数组,并将它们插入到javascript对象(JSON对象,无论如何)中。然后执行此操作的方法是迭代数组,如果您知道格式始终是name + date,则可以检查数组中的第一项是否为char,如果它是一个名称,则查找匹配来自JSON数组的对象,然后将所有值迭代到其中,直到找到另一个char项。下面的快速黑客,不是100%的循环正常运行,但你应该明白:
//a function to check for numbers
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
function isEmpty(str) {
return (!str || 0 === str.length);
}
var jsonObject //the object we're appending the values to in your example
var name
var i = 1 //ignore the first empty value
for( i < voteArray.length() ){
//check if a number
if (!isNumber(voteArray[i].charAt(0)) )
if ( isEmpty(voteArray[i])){
//end of list, break.
break;
}
name = voteArray[i];
//parse next two values and check if number
for( i < voteArray.length()){
if(isNumber(voteArray[i+1]) && isNumber(voteArray[i+2])){
//add the next numbers to JSON
jsonObject[name].voti = //sum votes
jsonOBject[name].date = //append date
i=i+2 //increment i
}
else{
if(isNumber(voteArray[i]){
i = i+1;
break;
}else (isNumber(voteArray[i]){
i = i+2;
break;
}
}
}
}
答案 1 :(得分:0)
您的阵列有点难以处理。这是一种解决方法,可以满足您的要求。但请注意,materia
必须有超过2个字符且投票少于3个字符,否则将无法正常工作
var array = [ '',
'elettrotecnica ed elettronica',
'10',
'7½',
'8½',
'5',
'9',
'7',
'4',
'7-',
'7+',
'6',
'7½',
'lingua e letteratura italiana',
'6½',
'5+',
'6',
'7+',
'5',
'6½',
'lingua inglese',
'6+',
'7',
'7-',
'7½',
'7',
'7+',
'matematica e complementi di matematica',
'4½',
'9½',
'7',
'6½',
'9',
'7½',
'4',
'9',
'7½',
'7',
'8',
'8',
'scienze motorie e sportive',
'5',
'7',
'6',
'9',
'7',
'10',
'8',
'10',
'7',
'sistemi automatici',
'8',
'8½',
'10',
'10',
'8½',
'9½',
'10',
'10',
'10',
'9-',
'storia',
'4',
'6',
'5½',
'tecnologie e progettazione di sistemi elettrici ed elettronici',
's',
'7-',
'7',
'8',
'8-',
'7+',
'7½',
'6',
'6',
'8',
'6+',
'7-',
'7-',
'6',
'7',
'6',
'8½',
'' ];
var jsonObj = {'materie':[]}
var i = -1;
var currentKey = '';
array.map(function(val){
if (val.length > 0) {
if (val.length > 2) {
currentKey = val.replace(/\s/g,'_');
var newObj = {};
newObj[currentKey] = {voti:[]}
jsonObj['materie'].push(newObj);
i++;
} else {
jsonObj['materie'][i][currentKey]['voti'].push(val);
}
}
});
document.write(JSON.stringify(jsonObj));