2014-11-23 8 views
10

Ho un problema in cui sto generando molti valori e ho bisogno di assicurarmi di lavorare solo con quelli unici. Poiché sto usando il nodo js, ​​con il flag --harmony e ho accesso alle raccolte di armoniche, ho deciso che un Set potrebbe essere un'opzione.uguaglianza degli oggetti definiti dall'utente per un insieme in armonia (es6)

Quello che sto cercando è qualcosa di simile al seguente esempio:

'use strict'; 

function Piece(x,y){ 
    this.x = x 
    this.y = y 
} 

function Board(width,height,pieces){ 
this.width = width 
this.height = height 
this.pieces = pieces 
} 

function generatePieces(){ 
return [ 
    new Piece(0,0), 
    new Piece(1,1) 
] 
} 

//boardA and boardB are two different but equivalent boards 
var boardA = new Board(10,10,generatePieces()) 
var boardB = new Board(10,10,generatePieces()) 

var boards = new Set() 
boards.add(boardA) 
boards.has(boardB) //return true 

Ora normalmente per raggiungere questo obiettivo in un'altra lingua, ad esempio C#, mi sarei aspettato di dover implementare una funzione uguale, come pure come funzione di generazione di codice hash per Board e Piece. Dal momento che mi aspetto che l'uguaglianza degli oggetti di default sia basata su riferimenti. O magari usare un tipo di valore immutabile speciale (diciamo una classe di case in scala)

C'è un mezzo per definire l'uguaglianza per i miei oggetti per risolvere il mio problema?

risposta

8

C'è un mezzo per definire l'uguaglianza per i miei oggetti per risolvere il mio problema?

No, non proprio. C'è stato some discussion about this on the mailing list. Il risultato è:

  • Costruisci la tua astrazione Set/Map su Set/Map, che converte gli oggetti in un valore primitivo in base alla tua funzione di hashing.
  • Attendere value objects coming in ES7.
+0

grazie, ho avuto la sensazione che fosse così. Il link alla discussione è molto utile. –

-2

Questo lo farà per i costruttori come quello con cui stai lavorando.

var sameInstance = function(obj1, obj2){ 
    return obj2 instanceof ob1.constructor; 
}; 

Alcuni altri tipi di oggetti potrebbero aver bisogno di qualcosa di diverso, ma questo dovrebbe essere ok per quello che ti serve.

Quanto sopra è quello che ti serve in forma di funzione. Per farlo funzionare con Set, è necessario ereditare l'oggetto Set e sostituire il metodo con il proprio .

+0

Non sto cercando una funzione di uguaglianza, né di modificare il comportamento del metodo has. Quello era solo un esempio, sto cercando di essere in grado di definire l'uguaglianza per il mio oggetto. In questo modo gli oggetti duplicati non sarebbero contenuti all'interno del set. –

+0

Mi scuse mike. –

+0

Nessun problema! Apprezzo la risposta; non volevo sembrare così volgare, volevo solo essere chiaro. –

Problemi correlati