2014-10-16 10 views
6

Ich habe eine Funktion, die ein paar Mal wiederholt wird, und ich glaube, dass es möglich ist, Variablen von einem Array zu vereinfachen und zu senden.Vereinfachen Sie meine Funktion (Schleife, Array)?

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); 
    } 

Vielleicht nur die Kategorien in eine Variable ändern und die Kategorien aus einem Array senden?

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

Antwort

4

Ihre Idee sollte funktionieren:

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); 
    }   
} 

Wenn das chkgroup Array wirklich das Objekt passt keys in masterdata Sie eine äußere for..in Schleife stattdessen verwenden:

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); 
    }   
} 

Beachten Sie, dass Es gibt keine Reihenfolge, die für for...in definiert ist, also wenn Sie garantieren müssen, dass Sie über dem o. i Objekteigenschaften in einer bestimmten Reihenfolge, könnte es besser sein, das vordefinierte Array zu verwenden.

Sie auch Lust mit $.map bekommen können:

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

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

in var i, masterdata.timing Änderungen mit den Kategorien. – triplethreat77

+0

@ triplethreat77: Ah! Entschuldigung, das habe ich nicht verstanden. Aktualisieren ... –

+0

@ triplethret77: Aktualisiert, bitte werfen Sie einen Blick –

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

In der Tat Ihr Code ist immer noch ein bisschen laut und nicht lesbar, dh Entwickler mindestens ein paar Minuten, um die Analyse zu verbringen zu verstehen, ob die Logik korrekt ist. Mit der Nutzung von loDash oder Unders, kann Ihr Code vereinfacht werden und sich in diese:

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); 

und Arbeitsprobe auf jsfiddle

Verwandte Themen