获取引用值的对象属性的键

时间:2013-06-09 21:52:47

标签: javascript

假设我有一个如下所示的对象:

var SomeObject = {

   '6.2013' : SomeArray1,
   '7.2013' : SomeArray2,
   '8.2013' : SomeArray3,
   '9.2013' : SomeArray4
};

然后,在我的代码中的某个地方,我有一个我设置的全局变量:

CurrentObject = SomeObject['7.2013'];

现在我的代码中的其他地方,我需要知道CurrentObject指向的密钥。基本上,我需要这样做:

var SomeObjectKey = .....(CurrentObject); 

那就是字符串'7.2013'

感谢您的建议。

3 个答案:

答案 0 :(得分:2)

found = Object.keys(SomeObject).filter(function(key) { 
   return SomeObject[key] === CurrentObject
})

返回一个“指向”该值的键列表(可以有多个键)。

正如评论中所指出的,这在IE8和Netscape导航器,Mosaic 1.2.3以及可能是Lynx for DOS中都不起作用,以防任何人给出...

如果您迫切需要支持过时的引擎,请不要使代码瘫痪,保持现代,美观和干净,并使用垫片修补损坏的部件。

答案 1 :(得分:1)

没有“标准”调用来执行此操作,您必须迭代对象的所有键,直到找到其值与所需值匹配的键。

请注意,如果您的值是“对象类型”(即包括数组),则直接===(或==)测试将仅比较参考相等性(即两个数组实际上是完全相同的两个数组)而不是他们的内容是相等的。

根据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.keysArray.prototype.filter的填充程序。

答案 2 :(得分:1)

简单的跨浏览器方式是迭代:

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

FIDDLE