如何在ES6中获取Set的第一个元素(EcmaScript 2015)

Jav*_*ter 52 javascript ecmascript-6

在ES6中,我们如何快速获得元素?

MDN语法集中,我没有找到答案.

Min*_*our 61

它们似乎没有公开List可以从instanced Object访问.这来自EcmaScript草案:

23.2.4设置实例的属性

Set实例是从Set原型继承属性的普通对象.设置实例也有[[SetData]]内部插槽.

[[SetData]]是Set所持有的值列表.

一个可能的解决方案(一个有点昂贵的解决方案)是获取迭代器然后调用next()第一个值:

var x = new Set();
x.add(1);
x.add({ a: 2 });
//get iterator:
var it = x.values();
//get first entry:
var first = it.next();
//get value out of the iterator entry:
var value = first.value;
console.log(value); //1
Run Code Online (Sandbox Code Playgroud)

值得一提的是:

Set.prototype.values === Set.prototype.keys
Run Code Online (Sandbox Code Playgroud)

  • 一些实验性能数据。方法1:`first = set.values().next().value`。方法 2:`first = [...set][0]`。方法3:`[first] = set`。方法 1 和 3 基本上都是 O(1)(无论设置大小如何,chrome 中每秒大约 1500 万次迭代,firefox 中每秒大约 150 万次)。方法 2 的时间复杂度为 O(n),按 n 的比例缩放,chrome 的速度大约为 1s / 300'000'000,firefox 的速度慢 10 倍。不要使用方法 2 (`first = [...set][0]`) 除非你的集合非常非常小:它比其他方法昂贵得多。 (20认同)
  • 或者在一行中使用thist.values().next().value (18认同)
  • 另一句:“[...theSet][0]” (6认同)
  • 顺便说一句,迭代器被认为是非常昂贵的,这种方法非常理想...... (4认同)
  • Protip:使用`.values()`而不是`.entries()` (3认同)
  • 并不是说迭代器是次优的或昂贵的,只是如果你必须创建一个迭代器来获取列表的第一个元素,那么这听起来很昂贵,而不是直接访问元素。 (3认同)
  • 为什么 javascript 不提供在集合中查找特定元素的方法?这有什么合理的理由吗? (3认同)
  • @AZSH 有一种方法可以在 javascript 集中查找特定元素。它是“theset.has(x)”。在集合中不能做的是通过索引检索项目,因为集合是无序的。javascript 缺少的是一种轻松地从集合中检索任何项目的方法。这就是这个答案试图提供的内容。 (3认同)
  • 套装实际上*已订购*。该文档多次提到您可以按插入顺序集成值/条目。由于集合内部保留了这些知识,因此如果您可以轻松获取索引“n”处的项目,那就太好了。 (2认同)
  • 另一个不错的方法,使用数组解构:`const [first] = theSet;` (2认同)
  • @ichigolas 集合保持插入顺序*不*意味着集合将其元素保留在索引结构中 - 特别是考虑到“O(1)”删除操作。获取索引“n”处的项目很可能具有“O(n)”时间复杂度。 (2认同)

xgq*_*rms 24

有很多解决方案

\n
    \n
  1. for...of环形
  2. \n
\n

\r\n
\r\n
const set = new Set();\nset.add(2);\nset.add(3);\n\n// return the first item of Set \xe2\x9c\x85\nfunction getFirstItemOfSet(set) {\n  for(let item of set) {\n    if(item) {\n       return item;\n    }   \n  }\n  return undefined;\n}\n\nconst first = getFirstItemOfSet(set);\nconsole.log(\'first item =\', first);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

    \n
  1. destructuring assignment
  2. \n
\n

\r\n
\r\n
const set = new Set();\nset.add(2);\nset.add(3);\n\n// only get the first item \xe2\x9c\x85\nconst [first] = set;\nconsole.log(\'first item =\', first, typeof first);\n// first item = 2 number
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

    \n
  1. ...spread操作员
  2. \n
\n

\r\n
\r\n
const set = new Set();\nset.add(2);\nset.add(3);\n\n// convert Set to Array \xe2\x9c\x85\nconst first = [...set][0];\nconsole.log(\'first item =\', first);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

    \n
  1. iterator&next()
  2. \n
\n

\r\n
\r\n
const set = new Set();\nset.add(2);\nset.add(3);\n\n// iterator \xe2\x9c\x85\nconst first = set.keys().next().value;\nconsole.log(`first item =`, first);\n\n// OR\nset.values().next().value;\n\n// OR\nset.entries().next().value[0];\n// OR\nset.entries().next().value[1];
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

参考文献

\n

https://www.cnblogs.com/xgqfrms/p/16564519.html

\n