Пользовательское равенство объекта для набора в гармонии (es6)

У меня есть проблема, когда я генерирую много значений и должен быть уверен, что работаю только с уникальными. Поскольку я использую node js, с флагом --harmony и имею доступ к коллекциям гармоник, я решил, что Set может быть вариантом.

То, что я ищу, похоже на следующий пример:

'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

Теперь, как правило, для достижения этого на другом языке, скажем, С#, я ожидаю, что вам придется реализовать функцию равенства, а также функцию генерации хеш-кода для обеих платформ и частей. Поскольку я ожидал, что равенство по умолчанию будет основано на ссылках. Или, возможно, использовать специальный неизменяемый тип значения (например, класс case в scala)

Есть ли способ определить равенство для моих объектов для решения моей проблемы?

Ответ 1

Есть ли способ определить равенство для моих объектов для решения моей проблемы?

Нет, не совсем. Было обсуждение этого вопроса в списке рассылки. Результат:

  • Создайте собственную абстракцию Set/Map поверх Set/Map, которая преобразует объекты в примитивное значение в соответствии с вашей хэш-функцией.
  • Подождите значения объектов, входящих в ES7.

Ответ 2

Это сделает это для конструкторов, как то, с чем вы работаете.

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

Некоторые другие типы объектов, вам может понадобиться что-то другое, но это должно быть хорошо для того, что вам нужно.

Вышеупомянутое то, что вам нужно в форме функции. Чтобы заставить его работать с Set, вам нужно наследовать объект Set и переопределить метод has с помощью собственного has.