2014-10-16 5 views
6

Ho una funzione che viene ripetuta alcune volte e credo sia possibile semplificare e inviare variabili da una matrice.Semplifica la mia funzione (loop, 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); 
    } 

Forse basta modificare le categorie in una variabile e inviare le catergories da una matrice?

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

risposta

4

La tua idea dovrebbe funzionare bene:

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

Se l'array chkgroup davvero corrisponde l'oggetto keys in masterdata, si potrebbe usare un for..in ciclo esterno invece:

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

Si noti che non esiste un ordine definito per for...in, quindi se è necessario garantire che si sta iterando oltre la Proprietà di bject in un certo ordine, potrebbe essere meglio usare l'array predefinito.

Si potrebbe anche ottenere l'immaginazione con $.map:

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 cambia con le categorie. – triplethreat77

+0

@ triplethreat77: Ah! Mi dispiace, mi sono perso. Aggiornamento ... –

+0

@ triplethreat77: aggiornato, si prega di dare un'occhiata –

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 realtà il codice è ancora un po 'rumoroso e non leggibile, cioè sviluppatore deve trascorrere almeno un paio di minuti l'analisi al fine di capire se la logica è corretta. Con l'utilizzo di loDash o di sottolineatura, il codice può essere semplificata e si trasformano in questo:

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

e il campione a lavorare su jsfiddle