Typoskript: Vermeiden Sie einen Vergleich nach Referenz
Brauche ich zum speichern einer Liste von Punkten, und überprüfen Sie, ob ein neuer Punkt ist bereits enthalten in dieser Liste
class Point {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
window.onload = () => {
var points : Point[] = [];
points.push(new Point(1,1));
var point = new Point(1,1);
alert(points.indexOf(point)); //-1
}
Offensichtlich Typoskript verwendet Vergleich von Referenz, aber in diesem Fall, das macht keinen Sinn. In Java oder C# würde ich überlastung der equals
Methode, in Maschinenschrift, das scheint nicht möglich zu sein.
Ich als Schleife durch das array mit foreach
und überprüfen jeden Eintrag für Gleichberechtigung, aber das scheint eher kompliziert und aufblasen würde den code.
Gibt es so etwas wie equals
in typescript ? Wie kann ich die Umsetzung meiner eigenen Vergleiche ?
- Typescript ist eine meta-Sprache, keine Sprache. Sie sollten sich Fragen, "gibt es so etwas wie gleich in javascript", Typoskript nicht.
- Wo / wie machst du den Vergleich, die in Ihrem Skript?
- Typoskript hat Generika. Sie hätten realisieren können benutzerdefinierte Containerklassen Sie, dass der check für sowas gleich. eine Schnittstelle icomparable und eine generische Klasse arraylist<T, wo T implementiert icomparable - > würde die Arbeit machen.
- Ich bin kein Experte, aber ich denke, dass dart bietet so etwas wie
hashcode
und Sie außer Kraft setzen kann. pchalin.blogspot.com/2014/04/... - Vielleicht eine würdige alternative zu Typescript?
- Auch frameworks wie Vue bieten eine option, um "Schlüssel" zur Identifizierung von Objekten, so ist es praktisch. Siehe vuejs.org/v2/guide/list.html
v-bind:key
- In WPF gibt es
SelectedValuePath
vielleicht? Um zu vermeiden, überschreibenEquals
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie wickeln die Sammlung in einem
PointList
das nurPoint
Objekte Hinzugefügt werden, die über eineadd
Methode, die überprüft, um sicherzustellen, dass keine Duplikate Hinzugefügt werden.Dies hat den Vorteil der Kapselung die "Keine Duplikate" - Regel an einer einzigen Stelle, anstatt in der Hoffnung, dass alle aufrufenden code überprüfen, bevor Sie hinzufügen ein Duplikat ist, was wäre, duplizieren der Regel an vielen stellen.
Eine Sache, die Sie tun können, ist zu versuchen, aus linq.js. Mit, dass, können Sie etwas wie das hier tun:
... das könntest du dann einfach implementieren diese Funktion auf Ihrem Objekt
... und verwenden Sie es wie diese
Typescript fügt keine Funktionalität auf JavaScript. Es ist nur "getippt" und einige syntax-Verbesserungen.
So, gibt es nicht eine Möglichkeit zum überschreiben
equals
in gleichwertiger Weise zu dem, was Sie getan haben könnte in C#.Jedoch, Sie zu Ende wäre wahrscheinlich eine
Hash
oder eine stark typisierteDictionary
in C# zu tun, ein effizientes lookup (neben der Anordnung potentiell), anstatt eine "index" - Funktion.Dafür, ich würde nur empfehlen, Sie verwenden ein assoziatives array-Struktur, die zum speichern der
Point
s.Würden Sie so etwas tun:
Wenn ein
Point
nicht vorhanden ist, überprüfen Sie diepoints
assoziatives array zurückgegeben wirdundefined
.Funktion wickeln Sie die Arrays einfach:
Schleife durch alle Punkte wäre einfach: