Transformar uma coleção (backbone) em um iterador

Às vezes, é bom ter um iterador que pode iterar sobre uma coleção, retornando valores de atributo para cada modelo.

Este padrão é completamente inspirado no padrão Iterator de Stoyan Stefanov ( verifique o livro )


collection
= [
{
"handle": "@fat",
"status": "Studying philosophy"
},
{
"handle: "@addyosmani",
"status": "Teaching how to web"
}
];

var makeIterator = function (collection, property) {
var agg = (function (collection) {
var index = 0,
length
= collection.length;

return {
next
: function () {
var element;
if (!this.hasNext()) {
return null;
}
element
= collection[index][property];
index
= index + 1;
return element;
},
hasNext
: function () {
return index < length;
},
rewind
: function () {
index
= 0;
},
current
: function () {
return collection[index];
}
};
})(collection);

return agg;
};
var iterator = makeIterator(collection, "handle");
// iterator.next() => "@ fat"
// iterator.next() => "@ addyosmani"
// iterator.next() => null