查看几个不同的文档,我看到的只是Map(ECMAScript6)键是布尔值,字符串或整数。有没有办法可以使用另一个自定义对象(使用新的CustomObject(x,y)构造函数调用调用)作为键添加?
我可以添加一个对象作为键,但无法检查Map是否具有所述对象。
var myMap = new Map();
myMap.set( new Tuple(1,1), "foo");
myMap.set('bar', "foo");
myMap.has(?);
myMap.has('bar'); // returns true
有解决方法吗?
var myMap = new Map();
myMap.set( new Tuple(1,1), "foo");
for(some conditions) {
var localData = new Tuple(1,1); //Use directly if exists in myMap?
map.has(localData) // returns false as this is a different Tuple object. But I need it to return true
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has
答案 0 :(得分:3)
您只需要保存对象的引用:
var myMap = new Map();
var myKey = new Tuple(1,1);
myMap.set( myKey, "foo");
myMap.set('bar', "foo");
myMap.has(myKey); // returns true; myKey === myKey
myMap.has(new Tuple(1,1)); // returns false; new Tuple(1,1) !== myKey
myMap.has('bar'); // returns true; 'bar' === 'bar'
编辑:以下是如何使用对象来实现您想要的,即通过值而不是通过引用来比较对象:
function Tuple (x, y) {
this.x = x;
this.y = y;
}
Tuple.prototype.toString = function () {
return 'Tuple [' + this.x + ',' + this.y + ']';
};
var myObject = {};
myObject[new Tuple(1, 1)] = 'foo';
myObject[new Tuple(1, 2)] = 'bar';
console.log(myObject[new Tuple(1, 1)]); // 'foo'
console.log(myObject[new Tuple(1, 2)]); // 'bar'
这些操作平均在恒定时间内运行,这比在线性时间内通过Map搜索类似对象键要快得多。
答案 1 :(得分:2)
当您将对象设置为地图时,您需要在检查地图是否具有相同的内存引用时进行传递。
示例:
const map = new Map();
map.set(new Tuple(1,1));
map.has(new Tuple(1,1)) // False. You are checking a new object, not the same as the one you set.
const myObject = new Tuple(1,1);
map.set(myObject);
map.has(myObject) // True. You are checking the same object.
修改强>
如果您真的必须这样做,您可以执行以下操作:
function checkSameObjKey(map, key) {
const keys = map.keys();
let anotherKey;
while(anotherKey = keys.next().value) {
// YOUR COMPARISON HERE
if (key.id == anotherKey.id) return true;
}
return false;
}
const map = new Map();
map.set({id: 1}, 1);
checkSameObjKey(map, {id: 1}); // True
checkSameObjKey(map, {id: 2}); // False