2010-02-01 7 views
3

J'ai une fonction dans un objet comme celui-ci:JavaScript: refactoring, évitant Array.push()

arrayofElements: function(item) { 

    var result = []; 

    if (item.isA) { 
     result.push(new Div('aClass', labels['A'])); 
    } 

    if (item.isC) { 
     result.push(new Div('cClass', labels['C'])); 
    } 

    if (item.isD) { 
     result.push(new Div('dClass', labels['D'])); 
    } 

    return result; 
}, 

Comment cela peut-il être refactorisé? Je n'aime pas avoir à pousser() chaque élément conditionnellement.

+0

Quels sont les autres propriétés ne 'item' ont? – outis

+2

Vous n'aimez pas la méthode .push()? ou les conditions entourant chaque appel? – scunliffe

+0

La propriété labels est-elle accessible depuis un objet item? – Max

Répondre

4

Vous pouvez déplacer les is* propriétés à un sous-objet de façon à les isoler, et boucle sur la sous les propriétés de -object

item.is={A:'aClass', C:'cClass'}; 
... 
arrayofElements: function(item) { 
    var result = []; 
    for (p in item.is) { 
     result.push(new Div(item.is[p], labels[p])); 
    } 
    return result; 
}, 

les valeurs item.is pourraient être les classes (comme indiqué), ou les valeurs item.is pourraient être des objets avec une propriété class, ou vous pouvez utiliser le nom de la propriété p comme un index dans anoth er objet pour obtenir les classes. Ce qui dépend en grande partie de ce que les item représentent et à quoi les classes d'éléments sont le plus étroitement associées.

1
arrayofElements: function(item) { 

var result = [], 
    items = ['A', 'C', 'D']; 
while(var i=0; i < items.length; i++) { 
    if(item["is" + items[i]]) { 
    result.push(new Div(items[i] + 'Class', labels[items[i]])) 
    } 
} 
return result; 
}, 

Rappelez-vous que obj.foo est le même que obj [ « foo »] en Javascript

0

Une variante de la solution de Larry:

arrayofElements: function(item) { 
    var result = [], letters = ['A','C','D'], ltr, i, len; 
    len = letters.length; 
    for (i = 0; i < len; i++) { 
    ltr = letters[i]; 
    if (item["is"+ltr]) { 
     result.push(new Div(ltr.toLowerCase()+"Class", labels[ltr])); 
    } 
    } 
    return result; 
}, 
0

Cette fonction évite d'utiliser push() et est fonctionnellement identique à la vôtre:

arrayofElements: function(item) { 

    if (item.isA) { 
     return [new Div('aClass', labels['A'])]; 
    } 

    if (item.isC) { 
     return [new Div('cClass', labels['C'])]; 
    } 

    if (item.isD) { 
     return [new Div('dClass', labels['D'])]; 
    } 

    return []; 
}, 
+0

pas tout à fait. Dans son code, si l'item ressemble à {isA: true, isC: true}, il retournera [new Div ('aClass', labels ['A']), new Div ('cClass', labels ['C' ])] 'Array # push modifie le tableau sur lequel il est appelé. – BaroqueBobcat

+0

Ah, vous avez raison. J'ai supposé qu'un élément ne pouvait être vrai que pour isA, isC ou isD. – yungsters