2017-01-13 192 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); 
 
}