当前位置:  开发笔记 > 编程语言 > 正文

获取插入Set的最后一个值

如何解决《获取插入Set的最后一个值》经验,为你挑选了3个好方法。

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并具有所需功能的链接集数据结构容器类.请参阅下面的答案.



1> mido..:

我无法找到任何方法来从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));


是否没有内置的固定时间解决方案?

2> Oriol..:

一些想法:

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

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.更完整的是,它还应该在构造集合时检测最新值,并在删除最后一个项目时更新值.



3> adeneo..:

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

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"

小提琴

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有