用户定义的对象相等于和谐的集合(es6)

时间:2014-11-23 21:40:56

标签: javascript ecmascript-harmony ecmascript-6

我有一个问题,我生成了很多值,需要确保我只使用独特的值。 由于我正在使用节点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

现在通常用另一种语言实现这一点,比如c#,我希望必须实现一个equals函数,以及一个用于Board和Piece的哈希码生成函数。因为我希望默认对象相等性基于引用。 或者使用特殊的不可变值类型(例如,scala中的case类)

有没有办法为我的对象定义相等来解决我的问题?

2 个答案:

答案 0 :(得分:8)

  

有没有办法为我的对象定义相等来解决我的问题?

不,不是真的。有some discussion about this on the mailing list。结果是:

  • 在Set / Map之上构建您自己的Set / Map抽象,它会根据您的散列函数将对象转换为原始值。
  • 等待value objects coming in ES7

答案 1 :(得分:-2)

这将为您正在使用的构造函数执行此操作。

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

某些其他类型的对象可能需要不同的东西,但这应该可以满足您的需求。

以上是您在功能形式中所需要的。要使其与Set一起使用,您必须继承Set对象,并使用您自己的has覆盖has方法。