获取插入Set的最后一个值

Tam*_*dus 31 javascript ecmascript-6

SetMDN文档说JavaScript Set对象保留元素的插入顺序:

Set对象是值的集合,您可以按插入顺序迭代其元素.

有没有办法将最后一项插入Set对象?

var s = new Set();
s.add("Alpha");
s.add("Zeta");
s.add("Beta");

console.log(getLastItem(s)); // prints "Beta"
Run Code Online (Sandbox Code Playgroud)

编辑

可以实现具有相同接口Set并具有所需功能的链接集数据结构容器类.请参阅下面的答案.

mid*_*ido 22

我无法找到任何方法来从ECMA 2015规范中插入最后一个值,可能他们从未想过这样的方法,但你可以这样做:

const a = new Set([1, 2, 3]);
a.add(10);
const lastValue = Array.from(a).pop();
Run Code Online (Sandbox Code Playgroud)

编辑:

在第二个想法,一个节省空间的解决方案可能是:

function getLastValue(set){
  let value;
  for(value of set);
  return value;
}

const a = new Set([1, 2, 3]);
a.add(10);
console.log('last value: ', getLastValue(a));
Run Code Online (Sandbox Code Playgroud)

  • 是否没有内置的固定时间解决方案? (2认同)
  • 我开始怀疑将“set”转换回“array”的开销。对于大型集合的情况,它可能会也可能不会表现出一些开销。然而,“.last”不包含在规范中是有道理的,因为理论上,set 不需要顺序。 (2认同)

Ori*_*iol 14

一些想法:

  • 考虑使用数组而不是集合.提取数组的最后一个元素很简单,例如

    array[array.length-1];
    array.slice(-1)[0];
    array.pop(); // <-- This alters the array
    
    Run Code Online (Sandbox Code Playgroud)

    如果你真的需要一个集合,你可以在想要提取最后一个项目时将其转换为数组,但这将花费时间和空间.

  • 手动迭代集合.这将花费时间,但没有复制到数组那么多的空间.例如(可能有更优雅的方法)

    var set = new Set([1, 2, 3]);
    var iter = set.values(), prev, curr;
    do {
      prev = curr;
      curr = iter.next();
    } while(!curr.done)
    var last = prev.value; // 3
    
    Run Code Online (Sandbox Code Playgroud)
  • 考虑以相反的顺序插入项目.然后你只需要获得集合中的第一个项目,这更容易:

    set.values().next().value;
    
    Run Code Online (Sandbox Code Playgroud)
  • 子类Set添加此新功能:

    class MySet extends Set {
      add(value) {
        super.add(value);
        this.last = value;
      }
    }
    var set = new MySet();
    set.add(1); set.add(2); set.add(3);
    set.last; // 3
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这只会检测添加的值add.更完整的是,它还应该在构造集合时检测最新值,并在删除最后一个项目时更新值.


ade*_*neo 11

是的,有一种方法可以做到这一点,你可以简单地将集合转换为数组并弹出最后一项

function getLastItem(_set) {
    return [..._set].pop();
}
Run Code Online (Sandbox Code Playgroud)

要获得键/值等,你可以做到

return [..._set.entries()].pop(); // the entire entry
return [..._set.keys()].pop();    // the key only
return [..._set.values()].pop();  // the value only
Run Code Online (Sandbox Code Playgroud)

如果您不想创建数组,则可能需要迭代并获取最后一个值,如下所示

var last; s.forEach(k => { last = k }); // last === "Beta"
Run Code Online (Sandbox Code Playgroud)

小提琴