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設定する必要があります。#bar0100%

セクションに名前を付ける必要がある場合は、次のように質問の数を数えることができます。

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

この関数は、データオブジェクト内の「質問」をカウントします。

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を返しますが、2つの「質問」オブジェクトしかないため、4つの質問があると私は混乱します。各「質問」オブジェクトを2として数えている場合は、返された関数の結果に2を掛けるだけです。

于 2012-09-12T15:50:48.077 に答える
1

カウントの質問への回答

オブジェクトを見るとdata、ありませんdata.question。質問は、または(および)sectionの下にあります。12data.section.1.questiondata.section.2.question

したがって、aをに設定するvarことから始めdata.sectionsます。セクションをループして、下の質問オブジェクトのサイズを確認し、それらを変数に合計します。次に、質問の総数があります。

次のパートに進みます。合計4つの質問があります。進捗状況は何を表示する必要がありますか?ユーザーが回答した質問の数または何ですか?

于 2012-09-12T15:30:00.440 に答える
1

あなたのobject data.questionisでは、オブジェクトundefinedの各プロパティにはプロパティがあるので、それらを数えることができます。sectionquestion

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

http://jsfiddle.net/KuJgN/

于 2012-09-12T15:31:25.217 に答える
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;
    })
});

データにセクションが1つしかない場合は、上記を次のように簡略化できます。

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 に答える