简化我的函数(循环,数组)?

6

我有一个函数被重复使用了几次,我相信可以通过简化并从数组中发送变量来实现。

var i = masterdata.timing.split(',');
        var index = 0;
        for (index = 0; index < i.length; ++index) {
            $("#timing_" + i[index].trim()).prop('checked', true);
        }

    var i = masterdata.concern.split(',');
    var index = 0;
    for (index = 0; index < i.length; ++index) {
        $("#concern_" + i[index].trim()).prop('checked', true);
    }

    var i = masterdata.steps.split(',');
    var index = 0;
    for (index = 0; index < i.length; ++index) {
        $("#steps_" + i[index].trim()).prop('checked', true);
    }

也许只需将分类更改为变量,并从数组中发送分类?
var chkgroup = [
            'timing, concern, steps'
        ]
3个回答

4

您的想法应该可以很好地实现:

var i;
var index = 0;
var j = 0;
var chkgroup = ['timing', 'concern', 'steps'];
var currentGroup;

for (j = 0; j < chkgroup.length; ++j) {
    currentGroup = chkgroup[j];

    i = masterdata[currentGroup].split(',');

    for (index = 0; index < i.length; ++index) {
        $("#" + currentGroup + "_" + i[index].trim())
            .prop('checked', true);
    }        
}

如果 `chkgroup` 数组确实与 `masterdata` 对象中的 `keys` 匹配,您可以使用外部的 `for..in` 循环代替内部循环:
var i;
var index = 0;
var currentGroup;

for (currentGroup in masterdata) {
    i = masterdata[currentGroup].split(',');

    for (index = 0; index < i.length; ++index) {
        $("#" + currentGroup + "_" + i[index].trim())
            .prop('checked', true);
    }        
}

注意,for...in没有定义顺序,因此如果您需要保证按照特定顺序迭代对象属性,则最好使用预定义数组。您还可以使用$.map进行更高级的操作:
var values = $.map(masterdata, function (i, currentGroup) {
    return $.map(i.split(','), function (val) {
        return $('#' + currentGroup + '_' + val.trim());
    });
});

$(values).prop('checked', true);

在变量i中,masterdata.timing会随着类别的改变而改变。 - triplethreat77
@triplethreat77:已更新,请查看。 - Andrew Whitaker

0
var chkgroup = [ 'timing', 'concern', 'steps' ];

setProps( chkgroup, masterdata );

function setProps( c, m ) {
    $.each(c, function(i, group) {
        var i = m[group]split(',');
        var index = 0;
        for (index = 0; index < i.length; ++index) {
            $("#" + group + "_" + i[index].trim()).prop('checked', true);
        }
    });
}

0
实际上,你的代码还是有些混乱且不易读懂,即开发人员需要花费至少几分钟来分析它,以了解逻辑是否正确。使用loDash或Underscore,你的代码可以被简化并转换为以下形式:
   var selector = _.chain(masterdata)
        //pick only needed items 
        .pick(masterdata, 'timing', 'concern', 'steps')
        .map(function (item, key) {
            //split and transform the string into selector, e.g. #timing_1
            var ids = item.split(',');
            var mapped = _.map(ids, function (id) { return "#" + key + "_" + id.trim(); });
            return mapped.join();
        })
        .value()
        .join();
    $(selector).prop('checked', true);

并提供jsfiddle上的工作示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接