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没有的每一个小东西,或者你会使用一些图书馆吗?你不能把你没有的每一件小事都填满,或者你会使用一些图书馆吗