0

我有一些像这样的示例数据:

var data = {
    "section": {
        "1": {
            "question": [{
                "id": "1a",
                "num": "1",
                "title": "test"
            }, {
                "id": "1b",
                "num": "2",
                "title": "test"
            }]
        },
        "2": {
            "question": [{
                "id": "2a",
                "num": "1",
                "title": "test"
            }, {
                "id": "2b",
                "num": "2",
                "title": "test"
            }]
        }
    }
}

使用这个我试图计算问题的数量。因此,对于这个数据样本,总共有 4 个问题......

计划是使用以下数据更新进度表宽度:

<div id="progress"><div id="bar"></div></div>

这是我开始整理的 JS 代码:

var number = 0, numQuestions, total, width;

function updateProgress() {

    number += 1;

    numQuestions = data.question;

    //total =

    width = total / number;

    $('#progress #bar').animate({'width':width});

}

为了得到width我猜我需要将两个部分和问题加在一起,然后除以进度条的宽度,然后将进度的宽度设置为该数字的数字??

任何人都可以提供一些帮助并指出我正确的方向吗?

主要问题是:

  • numQuestions 返回未定义,所以显然我做错了
  • 我不确定如何计算总数......这应该是#progress #bar根据 numQuestions 计算的宽度吗?还是完全不同的东西?
4

5 回答 5

3

我建议修改您的数据结构如下:

var data = {
    "sections": [ // sections is now an array instead of an object
        {
            "question": [{
                "id": "1a",
                "num": "1",
                "title": "test"
            }, {
                "id": "1b",
                "num": "2",
                "title": "test"
            }]
        },
        {
            "question": [{
                "id": "2a",
                "num": "1",
                "title": "test"
            }, {
                "id": "2b",
                "num": "2",
                "title": "test"
            }]
        }
    ]
}

除非您需要命名这些部分,否则无需键入它们。

然后,您可以像这样获取部分的数量:

var numSections = data.sections.length;

要获取所有部分的问题总数,您需要创建一个循环:

var numQuestions = 0;
for (var i = 0; i < data.sections.length; i++){
    var questions = data.sections[i].question;
    for (var j = 0; j < questions.length; j++){
        numQuestions++;
    }
}

然后,要更新进度条,您将:

function updateProgress() {
    number++;
    width = number / numQuestions * 100;
    $('#progress #bar').animate({'width':width + '%'});
}

你会想要#progress一个固定的宽度,并#bar有一个基于百分比的宽度,范围从0100%

如果您需要命名这些部分,您可以像这样计算问题的数量:

var numQuestions = 0;
for (var sect in data.section){
    var questions = data.section[sect].question;
    for (var j = 0; j < questions.length; j++){
        numQuestions++;
    }
}

您可以在这里看到所有这些工作:http: //jsfiddle.net/wAGHS/1/

于 2012-09-12T15:31:53.550 回答
1

在您的 updateProgress() 中,因为数据对象在关键“问题”处没有元素

data.question

将返回未定义。

假设:section 必须是一个对象,并且 question 必须是一个数组

并进一步假设数据可以包含多个“部分”,要获取数据中的问题总数,请尝试:

var total_questions=0;
Object.keys(data).forEach(function(k){
    Object.keys(data[k]).forEach(function(num){
        total_questions+=data[k][num]['question'] 
            ? data[k][num]['question'].length 
            : 0;
    })
});

如果数据只包含一个部分,则上述内容可以简化为:

var total_questions=0;
Object.keys(data.section).forEach(function(num){
    total_questions+=data.section[num]['question'] 
        ? data.section[num]['question'].length 
        : 0
});
于 2012-09-12T15:40:12.150 回答
1

此功能确实计算您的数据对象中的“问题”:

function countquestions(obj) {
   var count = 0;
   for(var prop in obj) {
       if (obj.hasOwnProperty(prop)){
           for(var propp in obj[prop]) {
               if (obj[prop].hasOwnProperty(propp)){
                   ++count;
               }
           }
       }
   }
   return count;
}

它为上面的数据对象返回 2,但是您说它有 4 个问题,这让我感到困惑,因为它只有两个“问题”对象。如果您将每个“问题”对象计为两个,那么只需将我的函数返回的结果乘以 2。

于 2012-09-12T15:50:48.077 回答
1

回答计数问题

如果您查看您的data对象,则没有data.question. 问题在下方section,然后在12data.section.1.questiondata.section.2.question)下方。

因此,首先将 a 设置vardata.sections遍历各个部分并检查下面问题对象的大小并将它们总结为一个变量。然后你就有了问题的总数。

现在到下一部分:您总共有四个问题。进度应该显示什么?用户回答的问题数量还是什么?

于 2012-09-12T15:30:00.440 回答
1

在您的object data.questionis 中undefined,由于对象的每个属性section都有一个question属性,您可以计算它们。

var number = 0;
for (key in data.section) {
   number++
}

http://jsfiddle.net/KuJgN/

于 2012-09-12T15:31:25.217 回答