如何在JavaScript中以相反的顺序遍历Set或Map?

霍尔格·斯蒂兹(Holger Stitz)

我正在寻找一种以相反顺序迭代SetMap的方法

按常规顺序考虑以下简单示例:

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()给出的迭代器也从头到尾。

以相反的顺序迭代Set(或Map)的解决方案是什么?

塔玛斯·赫格杜斯(Tamas Hegedus)

正如我在尝试将最后一项添加到Set时发现的那样,没有办法在Maps或Sets上获得反向迭代器因此,唯一的方法是使用中间数组并将其反转,如下所示:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Perl中循环遍历数组以查找元素子集(以相反顺序)

如何使用zscan以相反的顺序遍历Redis中的排序集?

Thymeleaf:如何以相反顺序遍历列表?

如何以相反的顺序遍历游标

如何以相反的顺序遍历shell参数?

在Java中以相反的顺序遍历列表

在Python中以相反顺序遍历列表

如何在Java中以相反的顺序迭代hashmap

如何在Google表格中以相反的顺序填写公式

如何在冒泡排序算法中获得相反的顺序

如何在Python中以相反的顺序获取字母范围?

如何在Scala中以相反的顺序迭代循环

如何在 For Next 中应用 Step -1 以相反顺序循环?

如何在php中以相反的顺序获取日期?

以相反的顺序遍历LinkedHashMap

我可以按相反的顺序遍历javascript对象吗?

我应该如何以相反的顺序遍历C ++容器的元素?

以相反的顺序遍历熊猫系列

如何在Java 8中以相反的顺序从列表中获取有序流

如何在C++中以相反的顺序读取二进制数据文件

如何在Java中以相反的顺序创建一个字符数组?

如何在Vue JS HTML中以相反的顺序显示JSON数据?

如何在PostgreSQL中以相反的顺序获取完整的树节点路径?

如何在Java中从头到尾读取文件(以相反的顺序)?

如何在 F# 中以相反的顺序有效地创建列表

如何在 Kotlin Android 的 recyclerView 中以相反的顺序显示从 Firestore 重试的数据?

如何在java中以相反的顺序从10到1打印计数?

如何在javascript中遍历php数组

如何在JavaScript中遍历JSON?