仅在for循环中迭代一次特定代码

时间:2016-12-17 09:04:28

标签: javascript jquery json ajax for-loop

经过几次尝试,我终于来到这里。我会得到一个可能的解决方案......

这是我的代码:

var sections=[];

sections.push({
    questions:questions
});

for(var q1  in questions1){
    if (questions1[q1].fieldtype == "checkbox") {
        var options=questions1[q1].mcoptions;
        for(var i=0;i < options.length;i++)
        {
            for(var c=0; c < checkedValues.length; c++)
            {
                if(options[i].value == checkedValues[c])
                {
                    questions.push({
                        seqNum : questions1[q1].seqNum, 
                        qtext : questions1[q1].qtext, 
                        qimage : questions1[q1].qimage,
                        fieldtype : questions1[q1].fieldtype,
                        mcoptions : mcoptions
                    });

                    mcoptions.push({
                        value : options[i].value,
                        greyOut : greyOut,
                    }); 

                    var grey=options[i].greyOut;
                    for(var g=0;g<grey.length;g++)
                    {
                        greyOut.push({
                            greyOut  : grey[g]
                        });
                    }
                }}
        }// for loop close
    }//fieldtype
}// q1 in questions

此代码将从API执行GET请求,比较复选框值并以JSON格式发布在另一个API中。

问题1)在比较if(options [i] .value == checkedValues [c])之后,我想要

           questions.push({
                seqNum : questions1[q1].seqNum, 
                qtext : questions1[q1].qtext, 
                qimage : questions1[q1].qimage,
                fieldtype : questions1[q1].fieldtype,
                mcoptions : mcoptions
            });

仅显示for循环中的一次。 mCoptions。 push和gray应迭代for循环中的其他值并在问题[]下显示。现在整个结构基于checkedValues进行迭代,但情况并非如此。

问题2)在mcoptions.push中的greyOut:greyOut之后,我想从API中获取并添加另一个具有动态键和值的项。像mcoptions [value:value,greyOut:gray [g],x:1]

问题3)如果我转到同一部分并更改我的答案并单击提交(POST请求),我希望删除部分[0]并完全替换。

请帮助并分享您宝贵的建议..非常感谢您提前。

JSON格式:

[{
    "sessionName": "XYZ",
    "ID": "123",
    "sections": [{
        "slabel": "Development",
        "qlabel": "text",
        "questions": [{
            "seqNum": "1",
            "qtext": "What level of understanding would you say there is of Dev principles and methods?",
            "qimage": "",
            "fieldtype": "checkbox",
            "mcoptions": [{
                "value": "none",
                "greyOut": [
                    "1.1",
                    "1.2"
                ],
                "dev": "0"
            }, {
                "value": "some",
                "greyOut": [],
                "cog": "10"
            }, ]
        }]
    }, {
        "slabel": "Development111",
        "qlabel": "text",
        "questions": [{
            "seqNum": "1",
            "qtext": "What level of understanding would you say there is of Dev principles and methods?",
            "qimage": "",
            "fieldtype": "checkbox",
            "mcoptions": [{
                "value": "none",
                "greyOut": [
                    "1.1",
                    "1.2"
                ],
                "dev": "0"
            }, {
                "value": "some",
                "greyOut": [],
                "cog": "10"
            }, ]
        }]
    }]

}]            

1 个答案:

答案 0 :(得分:0)

1)您可以在推送新项目之前测试questions是否已包含某些内容:

if (questions.length == 0) {
    questions.push({
        seqNum : questions1[q1].seqNum, 
        qtext : questions1[q1].qtext, 
        qimage : questions1[q1].qimage,
        fieldtype : questions1[q1].fieldtype,
        mcoptions : mcoptions
    });
}

2)执行API请求,并在回调中将附加属性添加到mcoptions值。您可以使用IIFE创建一个闭包来保存对需要在回调中更新的对象的引用。

var newmcoption = {
    value : options[i].value,
    greyOut : greyOut,
};
mcoptions.push(newmcoption);
(function(mcoption) {
    CallAPI(function(response) {
        mcoption.x = response;
    });
})(newmcoption);

3)我不确定我是否理解这部分问题,但我认为你可以这样做:

sections.length = 0;
sections.push({
    questions:questions
});

清除以前的数据并重新开始。