【问题标题】:JavaScript: refactoring, avoiding array.push()JavaScript:重构,避免 array.push()
【发布时间】:2010-02-01 04:09:20
【问题描述】:

我在这样的对象中有一个函数:

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

如何重构?我不喜欢有条件地 push() 每个项目。

【问题讨论】:

  • item 还有哪些其他属性?
  • 你不喜欢 .push() 方法吗?还是包装每个调用的条件?
  • 可以从项目对象中访问标签属性吗?

标签: javascript arrays


【解决方案1】:

您可以将is* 属性移动到子对象以隔离它们,并循环遍历子对象的属性

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

item.is 中的值可以是类(如图所示),或者item.is 中的值可以是具有class 属性的对象,或者您可以使用属性名称p 作为另一个索引对象来获取类。这在很大程度上取决于items 所代表的内容以及与元素类最密切相关的内容。

【讨论】:

    【解决方案2】:
    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;
    },
    

    记住 obj.foo 和 Javascript 中的 obj['foo'] 是一样的

    【讨论】:

      【解决方案3】:

      拉里解决方案的变体:

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

      【讨论】:

        【解决方案4】:

        此函数避免使用 push(),并且在功能上与您的相同:

        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 [];
        },
        

        【讨论】:

        • 不完全。在他的代码中,如果 item 看起来像 {isA:true,isC:true},它将返回 [new Div('aClass', labels['A']),new Div('cClass',labels['C'])] Array#push 修改它被调用的数组。
        • 啊,你是对的。我假设一个项目只能对 isA、isC 或 isD 之一为真。
        猜你喜欢
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多