k12th
@k12th
console.log(`You're pulling my leg, right?`);

Backbone.Collection и Symbol.iterator, как сделать лучше?

Грядет ES2015 aka ES6 aka Harmony. Пора тренироваться на домашних проектах!

Есть готовая функция, которая принимает на вход массив объектов вида {entities: []} и итерирует по ним, типа такого:
function iterateEntities (arr, iterator) {
    for (let item of arr) {
        for (let [index, entity] of item.entities.entries()) {
            iterator(entity, index, item);
        }
    }
}


Хочу итерировать по моделям коллекции, как будто это точно такие же plain-объекты, чтобы заюзать эту функцию.

Получилось так:
'use strict';

import Skull from 'backbone-skull';

function collectionIterator (models) {
    return  {
        _i: -1,
        next: function () {
            return {
                value: models[this._i + 1].attributes,
                done: models.length - 1 === ++this._i
            }
        }
    }
}

class CollectionAbstract extends Skull.Collection {
    [Symbol.iterator] () {
        	return collectionIterator(this.models);
    }
}

export default CollectionAbstract;


Тесты показывают, что работает, как задумано, но как-то неизящно. Нельзя ли как-то покрасивше, без этих вот ++this._i? Я плохо понимаю генераторы, может, с ними будет лучше?
  • Вопрос задан
  • 407 просмотров
Решения вопроса 1
k12th
@k12th Автор вопроса
console.log(`You're pulling my leg, right?`);
Правильный ответ, действительно, генераторы:

function* collectionIterator (models) {
    for (let model of models) {
        yield model.attributes;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы