So erhalten Sie das erste Element von Set in ES6 (EcmaScript 2015)

Lesezeit: 3 Minuten

Wie bekommen wir in ES6 schnell das Element?

in MDN-Syntax für Setich habe keine Antwort darauf gefunden.

  • Was ist für Sie das „Erste“?

    – Bergi

    12. September 2015 um 13:41 Uhr

  • „Set-Objekte sind Sammlungen von Werten. Sie können die Elemente eines Sets in der Reihenfolge der Einfügung durchlaufen.“ – developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – tonethar

    8. Juli um 21:23 Uhr

Benutzer-Avatar
MinusVier

Sie scheinen die Liste nicht verfügbar zu machen, damit sie vom instanzierten Objekt aus zugänglich ist. Dies ist aus dem EcmaScript-Entwurf:

23.2.4 Eigenschaften von Set-Instanzen

Set-Instanzen sind gewöhnliche Objekte, die Eigenschaften vom Set-Prototypen erben. Set-Instanzen haben auch eine [[SetData]]interner Steckplatz.

[[SetData]]ist die Liste der Werte, die das Set enthält.

Eine mögliche (etwas teure) Lösung besteht darin, sich einen Iterator zu schnappen und dann anzurufen next() für den ersten Wert:

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

Erwähnenswert auch das:

Set.prototype.values === Set.prototype.keys

  • Übrigens gelten Iteratoren als hübsch inteuer, dieser Ansatz ist ziemlich optimal…

    – Bergi

    12. September 2015 um 14:37 Uhr

  • Nicht zu sagen, dass Iteratoren suboptimal oder teuer sind, ist nur, dass, wenn Sie einen Iterator erstellen müssen, nur um das erste Element der Liste zu erfassen, das teuer klingt, im Gegensatz zum direkten Zugriff auf das Element.

    – MinusVier

    12. September 2015 um 14:40 Uhr


  • oder in einer Zeile thiset.values().next().value

    – Kofifus

    1. Oktober 2017 um 2:05 Uhr

  • Noch ein Einzeiler: [...theSet][0]

    – Alexandru Savin

    27. August 2020 um 14:56 Uhr


  • Ein bisschen experimentelle Leistungsdaten. Methode 1: first = set.values().next().value. Methode 2: first = [...set][0]. Methode 3: [first] = set. Die Methoden 1 und 3 sind im Grunde O (1) (etwa 15 Millionen Iterationen pro Sekunde in Chrom, 1,5 Millionen in Firefox, unabhängig von der Satzgröße). Methode 2 ist O(n) und skaliert mit n in einem Verhältnis von ungefähr 1s / 300.000.000 für Chrom und 10-mal langsamer für Firefox. Verwenden Sie nicht Methode 2 (first = [...set][0]), es sei denn, Ihre Sets sind sehr, sehr klein: Es ist viel teurer als die anderen Methoden.

    – NicolasB

    15. Oktober 2021 um 15:13 Uhr


Benutzer-Avatar
teranshil

Die eleganteste und praktischste Lösung, die ich gefunden habe, ist by Abrufen des ersten IteratorResult und Abrufen seines Werts set.values().next().value.

const set = new Set([0, 1, 2, 3, 4]);   
const first = set.values().next().value; // first will be equal to 0

Eine andere Wahl wird sein, die zu verwenden for..of Schleife so:

const mySet = new Set(["one", "two", 3]);
for (let item of mySet) {
    console.log(item);
    break;
}

Ein direkterer Weg, um das erste Element aus einem Set zu erhalten (funktioniert auch für Arrays):

const mySet = new Set(['foo', 'bar', 'baz'])
const [firstElement, secondElement, thirdElement] = mySet

console.log(thirdElement, firstElement, secondElement) // baz foo bar

Der beste Weg ist, den Iterator auf der zu verwenden Set<T>:

const mySet = new Set<string>(['one', 'two', 'three']);
const firstValue = mySet.values().next().value;
console.log(firstValue);

Sie könnten es auch in ein Array umwandeln und dann die normale Indizierung verwenden:

const mySet = new Set<string>(['one', 'two', 'three']);
const firstValue = Array.from(mySet)[0];
console.log(firstValue);

Der erste Weg ist vom Standpunkt der Komplexität aus besser, da kein neues Array erstellt werden muss.

Benutzer-Avatar
xgqfrms

es gibt viele lösungen

  1. for...of Schleife
const set = new Set();
set.add(2);
set.add(3);

// return the first item of Set ✅
function getFirstItemOfSet(set) {
  for(let item of set) {
    if(item) {
       return item;
    }   
  }
  return undefined;
}

const first = getFirstItemOfSet(set);
console.log('first item =', first);
  1. destrukturierende Aufgabe
const set = new Set();
set.add(2);
set.add(3);

// only get the first item ✅
const [first] = set;
console.log('first item =', first);
  1. ...spread Operator
const set = new Set();
set.add(2);
set.add(3);

// convert Set to Array ✅
const first = [...set][0];
console.log('first item =', first);
  1. iterator & next()
const set = new Set();
set.add(2);
set.add(3);

// iterator ✅
const first = set.keys().next().value;
console.log(`first item =`, first);

// OR
set.values().next().value;

// OR
set.entries().next().value[0];
// OR
set.entries().next().value[1];

Refs

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

1186890cookie-checkSo erhalten Sie das erste Element von Set in ES6 (EcmaScript 2015)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy