2014-03-24 43 views
3

我想了解如何编写JavaScript对象的枚举器。我遇到了一段Sharepoint code where items of a SP List were being obtained on the client side,在Sharepoint对象上正在执行类似于下面的代码。为JavaScript对象编写枚举器

var enumerator = list.getEnumerator(); 
while(enumerator.moveNext()) { 
    var currentItem = enumerator.getCurrent(); 
    // actions on currentItem 
} 

如果我可以写,可以在使用上述枚举迭代的自定义对象,如何将它看?这是我的尝试,但它不工作:

var list = { 
    items: ["A", "B", "C", "D", "E"], 
    counter: -1, 
    enumerator: { 
     moveNext: function() { 
      counter++; // outer object's variable not accessible 
      if(counter >= items.length) 
       return false; 
      else 
       return true; 
     }, 
     getCurrent: function() { 
      return items[counter]; // outer object's variable not accessible 
     } 
    }, 
    getEnumerator: function() { 
     return this.enumerator(); 
    } 
} 

var enumerator = list.getEnumerator(); 
while(enumerator.moveNext()) { 
    var currentItem = enumerator.getCurrent(); 
    alert(currentItem); 
} 

你能帮助我了解getEnumerator()如何能写成函数原型是适用于任何枚举对象?

回答

1

承蒙@xdazz和@Juan门德斯三分球,我能够制定出枚举函数原型:

Array.prototype扩展:

Array.prototype.getEnumerator = Array.prototype.getEnumerator || 
function() { 
    var items = this; 
    var counter = -1; 
    var enumerator = { 
     moveNext: function() { 
      counter++; 
      return (counter < items.length); 
     }, 
     getCurrent: function() { 
      return items[counter]; 
     } 
    } 
    return enumerator; 
}; 

用法:

var list = ["A", "B", "C", "D", "E"]; 

var enumerator = list.getEnumerator(); // makes any array enumerable 
while(enumerator.moveNext()) { 
    var currentItem = enumerator.getCurrent(); 
    alert(currentItem); 
} 

JSFIDDLE DEMO

1

可以使用list.

var list = { 
    items: ["A", "B", "C", "D", "E"], 
    counter: -1, 
    enumerator: { 
     moveNext: function() { 
      list.counter++; // outer object's variable not accessible 
      if(list.counter >= list.items.length) 
       return false; 
      else 
       return true; 
     }, 
     getCurrent: function() { 
      return list.items[list.counter]; // outer object's variable not accessible 
     } 
    }, 
    getEnumerator: function() { 
     return list.enumerator; 
    } 
} 

访问的变量或者你可以做一个函数来创建它的实例

function makeList(items) { 
    var list = { 
     items: items 
     counter: -1, 
     enumerator: { 
      moveNext: function() { 
       list.counter++; // outer object's variable not accessible 
       if(list.counter >= list.items.length) 
        return false; 
       else 
        return true; 
      }, 
      getCurrent: function() { 
       return list.items[list.counter]; 
      } 
    }, 
    getEnumerator: function() { 
     return list.enumerator; 
    } 
    return list; 
} 


var enumerator = makeList(["A", "B", "C", "D", "E"]).getEnumerator(); 
+0

这是有效的,但该对象并不总是被称为'list',不是?理想情况下,它会像'var listItems = getListItems(query); var listEnum = listItems.getEnumerator();'等等。 – SNag

+0

是的,但你的代码正在创建一个单例。让我做一个可以像班级那样做的人 –

+0

是的,那就是我正在寻找的东西。谢谢! – SNag

3

尝试以下:

var list = function() { 
    // these local variables could be accessed by inner functions. 
    var items = ["A", "B", "C", "D", "E"], 
     counter = -1; 
    return { 
     enumerator: { 
      moveNext: function() { 
       counter++; 
       return counter < items.length; 
      }, 
      getCurrent: function() { 
       return items[counter]; 
      } 
     }, 
     getEnumerator: function() { 
      // here should not be return this.enumerator() but just this.enumerator 
      return this.enumerator; 
     } 
    }; 
}; 

var enumerator = list().getEnumerator(); 
while(enumerator.moveNext()) { 
    var currentItem = enumerator.getCurrent(); 
    alert(currentItem); 
} 

THE JSFIDDLE DEMO.

+0

为什么不简单地说:'return!(counter> = items.length);'(in'enumerator.moveNext')? (被编辑的代码片段,所以它可以像答案中的代码一样工作。) –

+0

@DavidThomas:是的,那将是理想的! – SNag