当前位置: 首页 > 知识库问答 >
问题:

如何检查Javascript映射是否有对象键

罗华翰
2023-03-14

在查看几个不同的文档时,我只看到地图(ECMAScript6)键是布尔值、字符串或整数。有没有一种方法可以使用另一个定制的对象(用新的CustomObject(x, y)构造函数调用调用)作为键添加?

我可以添加一个对象作为密钥,但无法检查地图是否有所述对象。

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

共有2个答案

苗运珧
2023-03-14

将对象设置到地图时,在检查地图是否有对象时,需要传递相同的内存引用。

例子:

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
黄无尘
2023-03-14

您只需保存对对象的引用:

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'

这些操作平均将在固定时间内运行,这比在线性时间内通过贴图搜索类似的对象关键点要快得多。

 类似资料:
  • 问题内容: 我试图得到: 在我自己的脚本中,我以前只是使用它,因为我从来不需要作为属性: 因此,对于第二个对象,我想出了以下方法作为一种快速解决方案-大部分都能奏效。;) 问题是,这取决于浏览器是否强制执行只读属性,而并非所有人都这样做。 有没有好的替代品? 问题答案: 这可能很有趣: 它是DOM Level2的一部分。 更新2 :这是我在自己的库中实现它的方式:(以前的代码在Chrome中不起作

  • 问题内容: 我有一个需要循环通过的嵌套JSON对象,每个键的值可以是String,JSON数组或另一个JSON对象。根据对象的类型,我需要执行不同的操作。有什么方法可以检查对象的类型以查看它是String,JSON对象还是JSON数组? 我尝试使用和,但似乎都没有用,因为这将为JSON对象和数组都返回一个对象,并且在我这样做时给出错误。 更具体地说,在将JSON解析为JS对象之后,有什么方法可以检

  • 我有一个需要循环的嵌套JSON对象,每个键的值可以是字符串、JSON数组或其他JSON对象。根据对象的类型,我需要执行不同的操作。是否有任何方法可以检查对象的类型,以查看它是字符串、JSON对象还是JSON数组? 我尝试使用和,但两者似乎都不起作用,因为将为JSON对象和数组返回一个对象,并且当我执行时,会给出一个错误。 更具体地说,在将JSON解析为JS对象后,是否有任何方法可以检查它是普通字符

  • 问题内容: 我正在尝试编写一个接受字符串列表或单个字符串的函数。如果它是一个字符串,那么我想将其转换为仅包含一项的数组,因此我可以遍历它而不必担心错误。 那么,如何检查变量是否为数组? 我整理了以下各种解决方案,并创建了jsperf测试。它们都非常快,因此只需使用- 现在得到了很好的支持,并且可以跨框架使用。 问题答案: 在现代浏览器中,您可以 受Chrome5,Firefox 4.0,IE 9,

  • 问题内容: 如何检查值是否是JavaScript中的Object? 问题答案: 更新 : 这个答案是不完整的,并且会产生误导性的结果 。例如,在JavaScript中也被视为类型,更不用说其他几种极端情况了。请遵循以下建议,然后转到其他 原始答案 : 尝试使用和/或。 编辑:这个答案给出了一个如何检查变量属性的想法,但是它不是一个防弹配方(毕竟根本没有配方!)来检查它是否是一个对象,而不是对象。由

  • 我正在尝试使用流将一个列表映射到另一个列表。 原始列表的某些元素无法映射。也就是说,映射函数可能无法找到合适的新值。 null 对更好的方法的建议?或者我应该把溪流全部挖开,用好的旧循环?