2017-01-13 19 views
1

逆順でSetまたはMapを繰り返し処理する方法を探しています。 javascriptで逆の順序でセットまたはマップを反復処理する方法はありますか?

は、通常のために、この単純な例を考えてみましょう:

var mySet = new Set([1,2,3,4,5]); 
for(let myNum of mySet) { 
    console.log(myNum); // output: 1, 2, 3, 4, 5 in sepearte lines 
} 

Set.prototype.values()またはSet.prototype.entries()から与えられたイテレータは、スタートから先頭にもあります。

逆の順序でセット(またはマップ)を反復するソリューションは何でしょうか?

答えて

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); 
 
}

それとも、二重にリンクされたセットの実装この代替を使用することができます:だから唯一の方法は本当にこのように、中間アレイを使用し、それを逆にすることである

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); 
 
}

関連する問題