2017-01-13 41 views

回答

6

没有办法获得在地图上或设置一个反向迭代器,因为我已经找到了,而试图get the last item added to a Set。所以唯一的办法确实是使用一个中间阵列和扭转它,像这样:

var mySet = new Set([1,2,3,4,5]); 
 
for (let myNum of Array.from(mySet).reverse()) { 
 
    console.log(myNum); 
 
}

或者您可以使用此备用双向链表的Set实现:

class LinkedSetLink { 
 
    constructor(value) { 
 
    this.value = value; 
 
    this.prev = this; 
 
    this.next = this; 
 
    } 
 
    
 
    insertBefore(item) { 
 
    const prev = item.prev = this.prev; 
 
    const next = item.next = this; 
 
    next.prev = item; 
 
    prev.next = item; 
 
    } 
 
    
 
    remove() { 
 
    const prev = this.prev; 
 
    const next = this.next; 
 
    next.prev = prev; 
 
    prev.next = next; 
 
    } 
 
} 
 

 

 
class LinkedSet { 
 
    constructor(iterable) { 
 
    this._map = new Map(); 
 
    this._pivot = new LinkedSetLink(/* undefined */); 
 
    if (iterable) { 
 
     this._addAll(iterable); 
 
    } 
 
    } 
 

 
    _addAll(iterable) { 
 
    for (const item of iterable) { 
 
     this.add(item); 
 
    } 
 
    } 
 

 
    has(item) { 
 
    return this._map.has(item); 
 
    } 
 

 
    add(item) { 
 
    if (!this._map.has(item)) { 
 
     const link = new LinkedSetLink(item); 
 
     this._pivot.insertBefore(link); 
 
     this._map.set(item, link); 
 
    } 
 
    } 
 

 
    delete(item) { 
 
    const link = this._map.get(item); 
 
    if (link) { 
 
     this._map.delete(item); 
 
     link.remove(); 
 
    } 
 
    } 
 

 
    clear() { 
 
    this._map.clear(); 
 
    this._pivot.next = this._pivot.prev = this._pivot; 
 
    } 
 

 
    get size() { 
 
    return this._map.size; 
 
    } 
 

 
    values() { 
 
    return this._map.keys(); 
 
    } 
 

 
    keys() { 
 
    return this.values(); 
 
    } 
 

 
    [Symbol.iterator]() { 
 
    return this.values(); 
 
    } 
 

 
    *entries() { 
 
    for (const key of this.values()) { 
 
     yield [key, key]; 
 
    } 
 
    } 
 

 
    *reversedItems() { 
 
    let link = this._pivot.prev; 
 
    while (link !== this._pivot) { 
 
     yield link.value; 
 
     link = link.prev; 
 
    } 
 
    } 
 

 
    first() { 
 
    return this._pivot.next.value; 
 
    } 
 

 
    last() { 
 
    return this._pivot.prev.value; 
 
    } 
 
} 
 

 

 

 
const myset = new LinkedSet([1,2,3,4,5]); 
 
for (let item of myset.reversedItems()) { 
 
    console.log(item); 
 
}

+0

有没有可能索引每个项目从-1,并使索引 - 该项目的索引也是0? – kouty

+1

@kouty你不能索引到一个集合。如果你有一个数组,你可以做到这一点,但它是短(代码)来扭转它。 –

0

您可以创建一个数组,将其反转并生成一组新数组。

var mySet = new Set([1, 2, 3, 4, 5]), 
 
    reverseSet = new Set([...mySet].reverse()); 
 
    
 
console.log([...reverseSet]);

0

var mySet = new Set([1,2,3,4,5]); 
 
var reverse = [...mySet].reverse(); 
 
for(let myNum of reverse){ 
 
console.log(myNum); 
 
}