2016-03-19 2 views
1

Игра с ImmutableJS, документация нуждается в работе и действительных рабочих примерах.Доступ к ImmutableJS OrderedSet()

const a = [["a"],["b"],["c"]] 
const b = Immutable.List(a) 
const c = Immutable.OrderedSet(a) 

b.first() // => "a" 
b.get(1) // => "b" 
c.first() // => ["a"] 
c.get(1) // => undefined !uh oh! 
c.toList().get(1) // => "b" !indirect! 

Вопрос: Как распечатать 2 элемента .OrderedSet c без преобразования его в .list или перебрать весь список?

+1

Печатная история: '{set, orderedSet} .get' принимает значение в качестве аргумента и возвращает значение. https://github.com/facebook/immutable-js/issues/754 – danielepolencic

+0

@ danielepolencic: Согласен, что get (0) должен быть последовательным. Отчет об ошибке: https://github.com/facebook/immutable-js/issues/810 –

ответ

2

Вы можете сделать это, такие как:

// using some ES6 features 
let ordSet = immutable.OrderedSet([1, 2, 3]) 
let iterator = ordSet[Symbol.iterator] // get iterator to the collection 
iterator.next() // 1 
iterator.next() // 2 
iterator.next() // 3 

При этом, позвольте мне отметить, что даже если это не самый хороший синтаксис, с точки производительности, это лучшее, как он получает: OrderedSet делает не обеспечивают произвольный доступ к своим элементам, каждый элемент просто запоминает своего преемника и предшественника. Поэтому для получения n -го элемента требуется n переходов, независимо от того, является ли immutable.js некоторым причудливым помощником для него или нет. AFAIK, такая связанная с списком реализация OrderedSet неизбежна, если add/delete должен оставаться быстрым.

+0

Это приводит нас к старому выпуску в [связанном списке против массива] (http://stackoverflow.com/questions/393556/when -to-use-a-linked-list-over-a-array-array-list) vs HashSet vs TreeMap vs HashMap vs [вставить ваш любимый список], каждый со своим собственным эталоном для 'add' /' delete' –

Смежные вопросы