Reducing repeated code, jQuery
dry, jquery
Solution
There's usually a way to repeat yourself less.
var myObj = {
gender:'',
age:'',
children:'',
income:'',
stage2select:'',
day:'',
spend:'',
categories:'',
product:'',
price:'',
quantity:'',
total:''
};
var dependencies = [ 'gender', 'age', 'children', 'income', 'stage2select',
'day', 'spend', 'categories', 'product', 'price', 'quantity', 'total'];
var i;
for (i = 1; i < dependencies.length; i++) {
if (dependencies[i] != 'stage2select') {
var prev = dependencies[i-1];
var next = dependencies[i];
(function(prev, next) {
$("#" + prev + " li").click(function() {
myObj[prev] = $(this).text();
$('#' + next).show();
update();
});
})(prev, next);
}
}
$("#stage2select :radio").change(function () {
myObj.stage2select = $(this).val();
if ( $(this).val() == 'shopping_patterns') {
$('#day').show();
$('#block3').hide();
$('#block2').show();
}
if ( $(this).val() == 'specific_products') {
$('#product').show();
$('#block2').hide();
$('#block3').show();
}
update();
});
function update() {
var text = "";
$.each(myObj, function(i){
if (this != ''){
if (text.length){
text += " -> ";
}
text += this;
}
});
$("span.jquery_out").text(text);
}
Problem
Ok, so this works perfectly well now however i'm reckoning it could be more optomised as there is a lot of repeated code. Anyone care to have a go? ``` var myObj = { gender:'', age:'', children:'', income:'', stage2select:'', day:'', spend:'', categories:'', product:'', price:'', quantity:'', total:'' }; $("#gender li").click(function() { myObj.gender = $(this).text(); $('#age').show(); update(); }); $("#age li").click(function() { myObj.age = $(this).text(); $('#children').show(); update(); }); $("#children li").click(function() { myObj.children = $(this).text(); $('#income').show(); update(); }); $("#income li").click(function() { myObj.income = $(this).text(); $('#stage2select').show(); update(); }); $("#stage2select :radio").change(function () { myObj.stage2select = $(this).val(); if ( $(this).val() == 'shopping_patterns') { $('#day').show(); $('#block3').hide(); $('#block2').show(); } if ( $(this).val() == 'specific_products') { $('#product').show(); $('#block2').hide(); $('#block3').show(); } update(); }); $("#day li").click(function() { myObj.day = $(this).text(); $('#spend').show(); $("span.jquery_out").text(text); }); $("#spend li").click(function() { myObj.spend = $(this).text(); $('#categories').show(); update(); }); $("#categories li").click(function() { myObj.categories = $(this).text(); $('#total').show(); update(); }); $("#product li").click(function() { myObj.product = $(this).text(); $('#price').show(); update(); }); $("#price li").click(function() { myObj.price = $(this).text(); $('#quantity').show(); update(); }); $("#quantity li").click(function() { myObj.quantity = $(this).text(); $('#total').show(); update(); }); function update() { var text = ""; $.each(myObj, function(i){ if (this != ''){ if (text.length){ text += " -> "; } text += this; } }); $("span.jquery_out").text(text); } ```