2014-10-16 93 views
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); 
    } 

也許只是將類別更改爲變量並從數組中發送catergories?

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

回答

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數組對象keys真正匹配masterdata,你可以使用一個外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定義任何訂單,所以如果您需要保證您正在迭代o以特定順序執行bject屬性,使用預定義數組可能會更好。

你也可以得到花哨$.map

var values = $.map(masterdata, function (i, currentGroup) { 
    return $.map(i.split(','), function (val) { 
     return $('#' + currentGroup + '_' + val.trim()); 
    }); 
}); 

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

,masterdata.timing與類別的變化:隨着loDash或下劃線的使用,你的代碼可以簡化,變成這樣。 – triplethreat77 2014-10-16 16:27:46

+0

@ triplethreat77:啊!對不起,我錯過了。正在更新... – 2014-10-16 16:28:10

+0

@ triplethreat77:更新了,請看看 – 2014-10-16 16:30:03

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

其實你的代碼仍然是一個有點嘈雜,無法讀取,即開發者至少要花費幾分鐘的時間對其進行分析,以瞭解邏輯是否正確。在VAR我

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