Set的MDN文档说JavaScript Set
对象保留元素的插入顺序:
Set对象是值的集合,您可以按插入顺序迭代其元素.
有没有办法将最后一项插入Set
对象?
var s = new Set(); s.add("Alpha"); s.add("Zeta"); s.add("Beta"); console.log(getLastItem(s)); // prints "Beta"
编辑
可以实现具有相同接口Set
并具有所需功能的链接集数据结构容器类.请参阅下面的答案.
我无法找到任何方法来从ECMA 2015规范中插入最后一个值,可能他们从未想过这样的方法,但你可以这样做:
const a = new Set([1, 2, 3]); a.add(10); const lastValue = Array.from(a).pop();
编辑:
在第二个想法,一个节省空间的解决方案可能是:
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));
一些想法:
考虑使用数组而不是集合.提取数组的最后一个元素很简单,例如
array[array.length-1]; array.slice(-1)[0]; array.pop(); // <-- This alters the array
如果你真的需要一个集合,你可以在想要提取最后一个项目时将其转换为数组,但这将花费时间和空间.
手动迭代集合.这将花费时间,但没有复制到数组那么多的空间.例如(可能有更优雅的方法)
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
考虑以相反的顺序插入项目.然后你只需要获得集合中的第一个项目,这更容易:
set.values().next().value;
子类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
请注意,这只会检测添加的值add
.更完整的是,它还应该在构造集合时检测最新值,并在删除最后一个项目时更新值.
是的,有一种方法可以做到这一点,你可以简单地将集合转换为数组并弹出最后一项
function getLastItem(_set) { return [..._set].pop(); }
要获得键/值等,你可以做到
return [..._set.entries()].pop(); // the entire entry return [..._set.keys()].pop(); // the key only return [..._set.values()].pop(); // the value only
如果您不想创建数组,则可能需要迭代并获取最后一个值,如下所示
var last; s.forEach(k => { last = k }); // last === "Beta"
小提琴