计算数组中的对象以使用jQuery更改进度条

时间:2012-09-12 15:16:50

标签: javascript jquery

我有一些像这样的样本数据:

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返回undefined,显然我做错了
  • 我不确定如何计算总数...这应该是针对numQuestions计算的#progress #bar宽度吗?或完全不同的东西?

5 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

回答计算问题

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

首先,将var设置为data.sectionsLoop through下方问题对象的部分和check the size,并将它们汇总到一个变量。然后你有问题的总数。

现在到下一部分:你总共有四个问题。进展应该表现出什么?用户回答的问题数量是什么?

答案 2 :(得分:1)

object data.questionundefined,因为section对象的每个属性都有question属性,您可以计算它们。

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

http://jsfiddle.net/KuJgN/

答案 3 :(得分:1)

在你的updateProgress()中,因为数据对象在键'question'没有元素

data.question

将返回undefined。

假设:     部分必须是一个对象和     问题必须是一个数组

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

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

答案 4 :(得分: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,那么只需将函数的返回结果乘以2即可。