给定相同键/值的关联数组中的Concat值

时间:2018-01-27 22:45:49

标签: javascript jquery json

让我们说要推送一个对象然后执行JSON.stringify

"support_advice": [{
        "text": "",
        "group": "check_lifestyle_26",
        "value": "Physical activity & Exercise"
    }]

我现在想推新项目

"support_advice": [{
        "text": "",
        "group": "check_lifestyle_26",
        "value": "Overall General Health & Wellbeing"
    }]

通常情况下,我会得到以下内容

"support_advice": [{
        "text": "",
        "group": "check_lifestyle_26",
        "value": "Physical activity & Exercise"
    }, {
        "text": "",
        "group": "check_lifestyle_26",
        "value": "Overall General Health & Wellbeing"
    }]

但是,是否可以根据组连接值,以便实际输出更像

"support_advice": [{
        "text": "",
        "group": "check_lifestyle_26",
        "value": "Physical activity & Exercise, Overall General Health & Wellbeing"
    }]

完整的脚本

下面的脚本循环遍历表单中的每个元素,然后创建JSON,然后将其传递到所需的位置。

这很好用。然而,当问题出现时,复选框就会出现。系统的一部分允许您再次添加表单的部分名称。

对于像textarea或文本输入这样的东西,这很好。但是对于复选框,因为在第一个实例中可能有多个相同的名称,如果我再次添加包含复选框的另一个部分,则下面的脚本将无法在各个部分之间进行解密...

var elem = document.getElementById('rn_QuestionSubmit').elements;

            var a = [];
            var result = {};

            for(var i = 0; i < elem.length; i++)
            {
                var element = elem[i];
                var item = {};
                //item.id = element.id;
                //item.type = element.type;
                if (element.type === 'select-one') {
                    item.text = element.options[element.selectedIndex].text;
                }
                else {
                    item.text = '';
                }

                item.group = elem[i].dataset.group;

                if (element.type === 'radio' || element.type === 'checkbox') {
                    if (element.checked) {
                        item.value = element.value;
                        if (result[element.name]) { result[element.name].push(item) } else { result[element.name] = [item]};
                    }
                }
                else {
                    item.value = element.value;
                    if (result[element.name]) { result[element.name].push(item) } else { result[element.name] = [item]};
                }
            } 
            a.push(JSON.stringify(result));
            console.log('['+a.join(',') + ']');
            return('['+a.join(',') + ']');

1 个答案:

答案 0 :(得分:3)

您需要对代码进行微小更改才能使复选框/单选按钮情况发生:当element.name中存在result密钥时,下一次检查将是result中的最后一个条目{1}}数组具有相同的组。如果是,则修改其value属性,否则,执行您现在已经执行的操作。

以下是代码的一部分:

        if (result[element.name]) {
            // Get the last entry in the array 
            var lastEntry = result[element.name].slice(-1)[0];
            // If same group, then concatenate the value instead of adding the item 
            if (lastEntry.group === item.group) {
                lastEntry.value += "," + element.value;
            } else {
                // You already had this:
                result[element.name].push(item);
            }
        // You already had this:
        } else { 
            result[element.name] = [item]
        }