Javascript 获取引用值的对象属性的键
假设我有一个如下所示的对象:Javascript 获取引用值的对象属性的键,javascript,Javascript,假设我有一个如下所示的对象: var SomeObject = { '6.2013' : SomeArray1, '7.2013' : SomeArray2, '8.2013' : SomeArray3, '9.2013' : SomeArray4 }; CurrentObject = SomeObject['7.2013']; 然后,在我的代码中,我有一个全局变量,我设置如下: var SomeObject = { '6.2013' : SomeArray
var SomeObject = {
'6.2013' : SomeArray1,
'7.2013' : SomeArray2,
'8.2013' : SomeArray3,
'9.2013' : SomeArray4
};
CurrentObject = SomeObject['7.2013'];
然后,在我的代码中,我有一个全局变量,我设置如下:
var SomeObject = {
'6.2013' : SomeArray1,
'7.2013' : SomeArray2,
'8.2013' : SomeArray3,
'9.2013' : SomeArray4
};
CurrentObject = SomeObject['7.2013'];
现在,在代码的其他地方,我需要知道CurrentObject
指向的键。基本上,我需要这样做:
var SomeObjectKey = .....(CurrentObject);
这就是字符串'7.2013'
谢谢你的建议
found = Object.keys(SomeObject).filter(function(key) {
return SomeObject[key] === CurrentObject
})
返回“指向”该值的键列表(可以有多个键)
正如评论中指出的,这在IE8和Netscape navigator、Mosaic 1.2.3以及Lynx for DOS中都不起作用,以防有人给出
如果你迫切需要支持过时的引擎,不要破坏你的代码,保持它的现代性,美观和清洁,并使用垫片修补损坏的部分
返回“指向”该值的键列表(可以有多个键)
正如评论中指出的,这在IE8和Netscape navigator、Mosaic 1.2.3以及Lynx for DOS中都不起作用,以防有人给出
如果您迫切需要支持过时的引擎,请不要破坏您的代码,保持其现代、美观和干净,并使用垫片修补损坏的部分。没有“标准”调用来完成此操作,您必须迭代对象的所有键,直到找到一个值与所需值匹配的键
请注意,如果您的值是“对象类型”(即包括数组),则直接的==
(或==
)测试将仅比较引用相等性(即两个数组实际上是完全相同的两个数组),而不是它们的内容相等
根据thg435的回答,您可以添加以下功能:
Object.keysFor(obj, value) = function() {
return Object.keys(obj).filter(function(key) {
return obj[key] === value;
}
}
使用方法:
var SomeObjectKey = Object.keysFor(SomeObject, CurrentObject);
对于较旧的浏览器,MDN网站上提供了Object.keys
和Array.prototype.filter
的垫片。没有“标准”调用来执行此操作,您必须迭代对象的所有键,直到找到一个值与所需值匹配为止
请注意,如果您的值是“对象类型”(即包括数组),则直接的==
(或==
)测试将仅比较引用相等性(即两个数组实际上是完全相同的两个数组),而不是它们的内容相等
根据thg435的回答,您可以添加以下功能:
Object.keysFor(obj, value) = function() {
return Object.keys(obj).filter(function(key) {
return obj[key] === value;
}
}
使用方法:
var SomeObjectKey = Object.keysFor(SomeObject, CurrentObject);
对于较旧的浏览器,MDN网站上提供了
Object.key
和Array.prototype.filter
的垫片。简单的跨浏览器方式是迭代:
var SomeObject = {
'6.2013' : 'SomeArray1',
'7.2013' : 'SomeArray2',
'8.2013' : 'SomeArray3',
'9.2013' : 'SomeArray4'
};
var CurrentObject = SomeObject['7.2013'],
SomeObjectKey;
for (key in SomeObject) {
if (SomeObject[key] == CurrentObject) SomeObjectKey = key;
}
console.log(SomeObjectKey); // returns 7.2013
简单的跨浏览器方式是迭代:
var SomeObject = {
'6.2013' : 'SomeArray1',
'7.2013' : 'SomeArray2',
'8.2013' : 'SomeArray3',
'9.2013' : 'SomeArray4'
};
var CurrentObject = SomeObject['7.2013'],
SomeObjectKey;
for (key in SomeObject) {
if (SomeObject[key] == CurrentObject) SomeObjectKey = key;
}
console.log(SomeObjectKey); // returns 7.2013
对于对象,
=
和=
做同样的事情。@thg435我不是专门指对象的==
和=
,=
和==
做同样的事情。@thg435我并没有特别提到===
与=
作为其他答案注释-可能有多个键用于CurrentObject@OlegMikheev在这种情况下,OP应在问题中说明这种可能性。他没有暗示对象中的值是唯一的。我接受了你的答案,因为我需要它在IE8中工作(至少我不必担心IE7:)@frenchie:至少,在key
之前添加var
和hasOwnProperty
到循环体。@thg435-可能是个好主意,但由于循环只比较值,无需使用hasOwnProperty
,因为未定义不会成为问题,如果循环在全局范围内,则使用var
关键字也无所谓,因为for
循环没有自己的作用域。正如其他答案注释一样,可能有多个键用于CurrentObject@OlegMikheev在这种情况下,OP应在问题中说明这种可能性。他没有暗示对象中的值是唯一的。我接受了你的答案,因为我需要它在IE8中工作(至少我不必担心IE7:)@frenchie:至少,在key
之前添加var
和hasOwnProperty
到循环体。@thg435-可能是个好主意,但由于循环只比较值,使用hasOwnProperty
不是必需的,因为未定义不会成为问题,如果循环在全局范围内,使用var
关键字也没关系,因为for
循环没有自己的范围。你不能填充IE没有的每一个小东西,或者你会使用一些图书馆吗?你不能把你没有的每一件小事都填满,或者你会使用一些图书馆吗