Как я могу перебрать два массива, которые имеют общее свойство? - PullRequest
0 голосов
/ 29 апреля 2019

Я работал над очень тонкой системой Entity Component System в javascript, используя Pixi.js на веб-интерфейсе, и у меня возник вопрос к вам, ребята Распространенным шаблоном являются итераторы, которые вы используете в системах, например, в Unity вы можете сделать:

    [ComponentType1, ComponentType2], 
    (c1: ComponentType1, c2: ComponentType2) => {
         // run ops on the components
     })

Как бы вы разработали эту функцию forEach изнутри, учитывая, что у вас есть массив сущностей и два массива, содержащие эти типы компонентов, для которых необходимо вызвать функцию и передать эти два компонента в качестве аргументов? По сути, каков наиболее оптимизированный способ перебора объектов, имеющих компоненты обоих типов?

Кажется, простым способом является итератор по списку сущностей и проверка типов их компонентов, но мне интересно, есть ли лучший способ. Такой подход будет выглядеть примерно так:

function forEach<T, K>(components: [c1: T, c2: K], callback: (c1: T, c2: K)=> void) {
    entities.forEach((entity) => { 

        if (entity.hasComponent(c1) && entity.hasComponent(c2)) {

            callback(entity.getComponent(c1), entity.getComponent(c2)

        }
}
...