Пользовательское равенство объекта для набора в гармонии (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
.