Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Поиск внутри collection (backbone.js)

#underscorejs #javascript #backbonejs


Допустим, есть модель User с атрибутами id и name. Модель находиться в коллекции
UserList.
Я хочу быстро получить модель из коллекции, у которой имя равно "Jhony" или вместо
нее null, если таковой модели нет. Как мне это сделать?
Как выход, можно, конечно, поискать через underscore функции map, detect, select.
Но это кажется очень нагроможденным.     


Ответы

Ответ 1



Если нужно получать быстро, а моделей — много (т.е. O(n) не устраивает), но, при этом, значения полей небольшие и памятью можно пожертвовать — можно построить индексы. Например, сделав вспомогательный класс как-то так: class IndexedCollection extends Backbone.Collection index_by: [] initialize: -> @_indexes = {by_key: {}, by_id: {}} super _onModelEvent: (ev, model, collection, options) -> retval = super(ev, model, collection, options) id = model.id for k in @index_by v = model.get(k) @_indexes.by_key[k] ?= {} @_indexes.by_key[k][v] ?= [] @_indexes.by_id[k] ?= {} prev = @_indexes.by_id[k][id] if prev? and prev != v @_indexes.by_key[k][prev] = _.without @_indexes.by_key[k][prev], id @_indexes.by_id[k][id] = v switch ev when "add", "change" then @_indexes.by_key[k][v] = _.union @_indexes.by_key[k][v], [id] when "remove" then @_indexes.by_key[k][v] = _.without @_indexes.by_key[k][v], id retval getByIndex:(key, value) -> for id in @_indexes.by_key[key]?[value] ? [] @.get(id) Код — импровизация, набросок и прототип, не шибко оптимизированный и тестированный. И, да, извините за CoffeeScript, надеюсь разница значения не имеет — на JS писать как-то лень.

Ответ 2



Видимо нет более простого способа, в итоге я сделал себе метод у коллекции, что бы не было так громоздко, может кому поможет: getByAttr: function(attr, value){ return this.detect( function(model){ return model.get(attr) == value; }); },

Комментариев нет:

Отправить комментарий