我有一个非常简单的JavaScript对象,我将其用作关联数组。是否有一个简单的函数可以让我获取值对应的键名,还是我必须手动迭代对象并找到它?
我有一个非常简单的JavaScript对象,我将其用作关联数组。是否有一个简单的函数可以让我获取值对应的键名,还是我必须手动迭代对象并找到它?
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
ES6,没有原型突变或外部库。
例如,
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
const map = {"first" : "1", "second" : "2"};
console.log(getKeyByValue(map,"2"));
keys()
会将键集合实例化。 - David Ehrmannfunction getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
- sakethBiMap
或等效的数据结构(Alethes的回答)通常是解决更广泛问题的高效O(1)方法,但即使是一次性操作,也可以使用for in
循环迭代,在找到匹配项时中断,而不是预先创建完整的键数组,这会导致最坏情况下的最佳情况,即O(position)而非O(size)。(此页面上唯一比O(size)更糟糕的答案是愚蠢的JSON答案。) - Ry-没有标准的可用方法。您需要进行迭代,并可以创建一个简单的助手:
Object.prototype.getKeyByValue = function( value ) {
for( var prop in this ) {
if( this.hasOwnProperty( prop ) ) {
if( this[ prop ] === value )
return prop;
}
}
}
var test = {
key1: 42,
key2: 'foo'
};
test.getKeyByValue( 42 ); // returns 'key1'
一个警告:即使上述方法有效,通常来说扩展任何主机或本地对象的.prototype
是一个不好的做法。我在这里这样做只是因为它很好地解决了问题。无论如何,你应该在.prototype
之外使用这个函数,并将对象传递给它。
就像所言,需要进行迭代。例如,在现代浏览器中您可以使用以下代码:
var key = Object.keys(obj).filter(function(key) {return obj[key] === value})[0];
其中value
包含您要查找的值。鉴于此,我可能会使用循环。
否则,您可以使用适当的 "哈希映射"对象 - 在JS中有几个实现 - 或自己实现。
更新2018年
六年过去了,但我仍然在这里得到一些投票,所以我觉得应该在答案中提到一个更现代的解决方案 - 适用于现代浏览器/环境 - 而不仅仅是在评论中:
const key = Object.keys(obj).find(key => obj[key] === value);
当然它也可以是一个函数:
const getKeyByValue = (obj, value) =>
Object.keys(obj).find(key => obj[key] === value);
Object.keys(obj).or(o=>o[key] === value)
可以翻译为:获取对象中属性值等于特定值的属性名列表。 - Benjamin Gruenbaumor
数组方法,并且它在这里的目的对我来说不太清楚:我将感激一些额外的细节! :) - ZER0or
,当然可以!它最近被评估并接受了(我认为还没有人实现它)。它的作用是查找数组中与谓词匹配的第一个元素并返回它。因此 [1,2,3,4].or(x=>x>2)
将返回 3
,[1,2,3,4,5].or(x=>x<3)
将返回 1
。类似于 C# 的 FirstOrDefault :) - Benjamin Gruenbaum最短的一句话
let key = Object.keys(obj).find(k=>obj[k]===value);
返回所有具有该值的键:
let keys = Object.keys(obj).filter(k=>obj[k]===value);
如果value是一个Array
或Object
:let keys = Object.keys(obj).filter(k=>JSON.stringify(obj[k])===JSON.stringify(value));
使用Underscore.js库:
var hash = {
foo: 1,
bar: 2
};
(_.invert(hash))[1]; // => 'foo'
lodash的方式 https://lodash.com/docs#findKey
var users = {
'barney': { 'age': 36, 'active': true },
'fred': { 'age': 40, 'active': false },
'pebbles': { 'age': 1, 'active': true }
};
_.findKey(users, { 'age': 1, 'active': true });
// → 'pebbles'
_.findKey(users,{'age':1,'active':true});
……它与原来的意思相同。 - craigmichaelmartin_.find_key({a: "A", b:"B"}, "B"})
返回 undefined
,因此根据这里所述,你需要使用 _.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
。 - ryan2johnson9_.invert(haystack)[needle]
- Empi_.findKey({a: "A", b: "B"}, value => value === "B") // => "b"
,因为第二个参数是一个谓词。简写形式_.findKey({...}, "B")
将查找名为B
的属性:{b: { B: ... } }
。 - MeltedPenguinfunction extractKeyValue(obj, value) {
return Object.keys(obj)[Object.values(obj).indexOf(value)];
}
function objectKeyByValue (obj, val) {
return Object.entries(obj).find(i => i[1] === val);
}
.entries()
现在得到了广泛支持,但最终第一个版本仍然更好,因为它不是通过JS回调进行迭代,而是使用本地的indexOf
。我使用这个函数:
Object.prototype.getKey = function(value){
for(var key in this){
if(this[key] == value){
return key;
}
}
return null;
};
用法:
// ISO 639: 2-letter codes
var languageCodes = {
DA: 'Danish',
DE: 'German',
DZ: 'Bhutani',
EL: 'Greek',
EN: 'English',
EO: 'Esperanto',
ES: 'Spanish'
};
var key = languageCodes.getKey('Greek');
console.log(key); // EL
obj.hasOwnProperty(key)
吗?或者在这种情况下是不必要的? - V-Light不可迭代的解决方案
主函数:
var keyByValue = function(value) {
var kArray = Object.keys(greetings); // Creating array of keys
var vArray = Object.values(greetings); // Creating array of values
var vIndex = vArray.indexOf(value); // Finding value index
return kArray[vIndex]; // Returning key by value index
}
键值对组成的对象:
var greetings = {
english : "hello",
ukranian : "привіт"
};
测试:
keyByValue("привіт");
// => "ukranian"
Object.keys(greetings)[Object.values(greetings).indexOf('привіт')]
- shutsman保持你的原型整洁。
function val2key(val,array){
for (var key in array) {
if(array[key] == val){
return key;
}
}
return false;
}
例子:
var map = {"first" : 1, "second" : 2};
var key = val2key(2,map); /*returns "second"*/
var o = []; var map = {first: o, second: o}
。find_key(o)
会返回什么? - Gareth