我有一个非常简单的JavaScript对象,用作关联数组。是否有一个简单的函数允许我获取值的键,还是必须迭代该对象并手动找到它?
var o = []; var map = {first: o, second: o}
。什么会find_key(o)
回来?
我有一个非常简单的JavaScript对象,用作关联数组。是否有一个简单的函数允许我获取值的键,还是必须迭代该对象并手动找到它?
var o = []; var map = {first: o, second: o}
。什么会find_key(o)
回来?
Answers:
使用Underscore.js库:
var hash = {
foo: 1,
bar: 2
};
(_.invert(hash))[1]; // => 'foo'
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
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()
化了密钥集。
function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
没有可用的标准方法。您需要进行迭代,然后可以创建一个简单的帮助器:
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
,并将对象传递给它。
.toString()
愿意就可以添加obj[ key ].toString()
和添加值...
如前所述,需要迭代。例如,在现代浏览器中,您可能会:
var key = Object.keys(obj).filter(function(key) {return obj[key] === value})[0];
其中value
包含您要查找的值。话虽如此,我可能会使用一个循环。
否则,您可以使用适当的“ hashmap”对象-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)
or
数组的方法,在这里我不清楚它的目的:我将不胜感激!:)
or
肯定!它是最近才被评估和接受的(我认为还没有人实现它)。它要做的是找到与谓词匹配的数组的第一个元素并返回它。所以[1,2,3,4].or(x=>x>2)
会回来3
,[1,2,3,4,5].or(x=>x<3)
也会回来1
。类似于C#的FirstOrDefault :)
or
方法的链接?从您提到的内容来看,它似乎返回了与谓词“或”数组本身匹配的项?
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 });
...相同
_.find_key({a: "A", b:"B"}, "B"})
返回,undefined
如此处所述,您需要这样做 _.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
function extractKeyValue(obj, value) {
return Object.keys(obj)[Object.values(obj).indexOf(value)];
}
专为闭包编译器提取键名而编译后将未知
更性感的版本,但使用了未来的Object.entries
功能
function objectKeyByValue (obj, val) {
return Object.entries(obj).find(i => i[1] === val);
}
Object.entries(obj).find(i => i[1] === val);
使用filter
代替Object.entries(obj).filter(i => i[1] === val);
我使用此功能:
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)
在这种情况下,您不应该一直检查还是不必要?
不可迭代的解决方案
主功能:
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('привіт')]
如果你正在使用下划线或Lodash库,你可以使用_.findKey功能:
var users = {
'barney': { 'age': 36, 'active': true },
'fred': { 'age': 40, 'active': false },
'pebbles': { 'age': 1, 'active': true }
};
_.findKey(users, function(o) { return o.age < 40; });
// => 'barney' (iteration order is not guaranteed)
// The `_.matches` iteratee shorthand.
_.findKey(users, { 'age': 1, 'active': true });
// => 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.findKey(users, ['active', false]);
// => 'fred'
// The `_.property` iteratee shorthand.
_.findKey(users, 'active');
// => 'barney'
我创建了bimap库(https://github.com/alethes/bimap),该库实现了功能强大,灵活高效的JavaScript双向地图接口。它没有依赖性,并且可以在服务器端(在Node.js中,可以使用进行安装npm install bimap
)和浏览器(通过链接到lib / bimap.js)使用。
基本操作非常简单:
var bimap = new BiMap;
bimap.push("k", "v");
bimap.key("k") // => "v"
bimap.val("v") // => "k"
bimap.push("UK", ["London", "Manchester"]);
bimap.key("UK"); // => ["London", "Manchester"]
bimap.val("London"); // => "UK"
bimap.val("Manchester"); // => "UK"
键值映射的检索在两个方向上都同样快。引擎盖下没有昂贵的对象/数组遍历,因此无论数据大小如何,平均访问时间均保持不变。
由于这些值是唯一的,因此应该可以将这些值添加为一组附加键。这可以通过以下快捷方式完成。
var foo = {};
foo[foo.apple = "an apple"] = "apple";
foo[foo.pear = "a pear"] = "pear";
这将允许通过键或值进行检索:
var key = "apple";
var value = "an apple";
console.log(foo[value]); // "apple"
console.log(foo[key]); // "an apple"
这确实假定键和值之间没有公共元素。
鉴于input={"a":"x", "b":"y", "c":"x"}
...
output={"x":"a","y":"b"}
):input = {
"a": "x",
"b": "y",
"c": "x"
}
output = Object.keys(input).reduceRight(function(accum, key, i) {
accum[input[key]] = key;
return accum;
}, {})
console.log(output)
output={"x":"c","y":"b"}
):input = {
"a": "x",
"b": "y",
"c": "x"
}
output = Object.keys(input).reduce(function(accum, key, i) {
accum[input[key]] = key;
return accum;
}, {})
console.log(output)
output={"x":["c","a"],"y":["b"]}
):input = {
"a": "x",
"b": "y",
"c": "x"
}
output = Object.keys(input).reduceRight(function(accum, key, i) {
accum[input[key]] = (accum[input[key]] || []).concat(key);
return accum;
}, {})
console.log(output)
output['x']
。那是你在问什么吗?
var a = new Array();
a.push({"1": "apple", "2": "banana"});
a.push({"3": "coconut", "4": "mango"});
GetIndexByValue(a, "coconut");
function GetIndexByValue(arrayName, value) {
var keyName = "";
var index = -1;
for (var i = 0; i < arrayName.length; i++) {
var obj = arrayName[i];
for (var key in obj) {
if (obj[key] == value) {
keyName = key;
index = i;
}
}
}
//console.log(index);
return index;
}
这只是一种好奇心,它带给您...
如果您确定您的对象只有字符串值,那么您真的会费劲自己来构想此实现:
var o = { a: '_A', b: '_B', c: '_C' }
, json = JSON.stringify(o)
, split = json.split('')
, nosj = split.reverse()
, o2 = nosj.join('');
var reversed = o2.replace(/[{}]+/g, function ($1) { return ({ '{':'}', '}':'{' })[$1]; })
, object = JSON.parse(reversed)
, value = '_B'
, eulav = value.split('').reverse().join('');
console.log('>>', object[eulav]);
也许有一些有用的东西可以在这里建立...
希望这使您开心。
这是Lodash的解决方案,它适用于平面键=>值对象,而不是嵌套对象。接受的答案建议使用_.findKey
适用于带有嵌套对象的对象,但在这种常见情况下不起作用。
此方法反转对象,将键交换为值,然后通过在新的(反转的)对象上查找值来查找键。如果找不到该键,则false
返回该键,我更愿意这样做undefined
,但是您可以在中_.get
方法的第三个参数中轻松地将其换出getKey()
。
// Get an object's key by value
var getKey = function( obj, value ) {
var inverse = _.invert( obj );
return _.get( inverse, value, false );
};
// US states used as an example
var states = {
"AL": "Alabama",
"AK": "Alaska",
"AS": "American Samoa",
"AZ": "Arizona",
"AR": "Arkansas",
"CA": "California",
"CO": "Colorado",
"CT": "Connecticut",
"DE": "Delaware",
"DC": "District Of Columbia",
"FM": "Federated States Of Micronesia",
"FL": "Florida",
"GA": "Georgia",
"GU": "Guam",
"HI": "Hawaii",
"ID": "Idaho",
"IL": "Illinois",
"IN": "Indiana",
"IA": "Iowa",
"KS": "Kansas",
"KY": "Kentucky",
"LA": "Louisiana",
"ME": "Maine",
"MH": "Marshall Islands",
"MD": "Maryland",
"MA": "Massachusetts",
"MI": "Michigan",
"MN": "Minnesota",
"MS": "Mississippi",
"MO": "Missouri",
"MT": "Montana",
"NE": "Nebraska",
"NV": "Nevada",
"NH": "New Hampshire",
"NJ": "New Jersey",
"NM": "New Mexico",
"NY": "New York",
"NC": "North Carolina",
"ND": "North Dakota",
"MP": "Northern Mariana Islands",
"OH": "Ohio",
"OK": "Oklahoma",
"OR": "Oregon",
"PW": "Palau",
"PA": "Pennsylvania",
"PR": "Puerto Rico",
"RI": "Rhode Island",
"SC": "South Carolina",
"SD": "South Dakota",
"TN": "Tennessee",
"TX": "Texas",
"UT": "Utah",
"VT": "Vermont",
"VI": "Virgin Islands",
"VA": "Virginia",
"WA": "Washington",
"WV": "West Virginia",
"WI": "Wisconsin",
"WY": "Wyoming"
};
console.log( 'The key for "Massachusetts" is "' + getKey( states, 'Massachusetts' ) + '"' );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
这是我的解决方案首先:
例如,我假设我们有一个包含三个值对的对象:
function findKey(object, value) {
for (let key in object)
if (object[key] === value) return key;
return "key is not found";
}
const object = { id_1: "apple", id_2: "pear", id_3: "peach" };
console.log(findKey(object, "pear"));
//expected output: id_2
我们可以简单地编写一个带两个参数的findKey(array,value),这两个参数是对象和要查找的键的值。因此,此方法是可重用的,并且您不需要每次仅通过为此函数传递两个参数来手动迭代对象。
我通常推荐lodash而不是下划线。
如果有,请使用它。
如果不这样做,则应考虑使用lodash.invert npm软件包,该软件包很小。
这是您可以使用gulp测试的方法:
1)创建一个名为gulpfile.js的文件,其内容如下:
// Filename: gulpfile.js
var gulp = require('gulp');
var invert = require('lodash.invert');
gulp.task('test-invert', function () {
var hash = {
foo: 1,
bar: 2
};
var val = 1;
var key = (invert(hash))[val]; // << Here's where we call invert!
console.log('key for val(' + val + '):', key);
});
2)安装lodash.invert软件包和gulp
$ npm i --save lodash.invert && npm install gulp
3)测试是否有效:
$ gulp test-invert
[17:17:23] Using gulpfile ~/dev/npm/lodash-invert/gulpfile.js
[17:17:23] Starting 'test-invert'...
key for val(1): foo
[17:17:23] Finished 'test-invert' after 511 μs
参考文献
这为我工作,以获得对象的键/值。
let obj = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'key4': 'value4'
}
Object.keys(obj).map(function(k){
console.log("key with value: "+k +" = "+obj[k])
})
把事情简单化!
您无需通过复杂的方法或库来过滤对象,Javascript具有一个称为Object.values的内置函数。。
例:
let myObj = {jhon: {age: 20, job: 'Developer'}, marie: {age: 20, job:
'Developer'}};
function giveMeTheObjectData(object, property) {
return Object.values(object[property]);
}
giveMeTheObjectData(myObj, 'marie'); // => returns marie: {}
这将返回对象属性数据。
参考文献
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values