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"));
사용할 수 있는 표준 방법이 없습니다.반복해야 하며 간단한 도우미를 만들 수 있습니다.
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
6년이 지났지만, 아직 투표가 있기 때문에, 최신의 브라우저/환경에 대한 보다 현대적인 솔루션은 코멘트 뿐만이 아니라, 답변 자체에 기재할 필요가 있다고 생각합니다.
const key = Object.keys(obj).find(key => obj[key] === value);
물론 다음과 같은 기능도 사용할 수 있습니다.
const getKeyByValue = (obj, value) =>
Object.keys(obj).find(key => obj[key] === value);
Underscore.js 라이브러리의 경우:
var hash = {
foo: 1,
bar: 2
};
(_.invert(hash))[1]; // => 'foo'
최단 라이너 1개
let key = Object.keys(obj).find(k=>obj[k]===value);
다음 값과 함께 모든 키를 반환합니다.
let keys = Object.keys(obj).filter(k=>obj[k]===value);
이 '하다'인 Array
★★★★★★★★★★★★★★★★★」Object
:
let keys = Object.keys(obj).filter(k=>JSON.stringify(obj[k])===JSON.stringify(value));
lodash way 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'
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.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
반복 불가능한 솔루션
주요 기능:
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"
프로토타입을 깨끗하게 유지하십시오.
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"*/
언더스코어 또는 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'
강력하고 유연하며 효율적인 JavaScript 양방향 맵 인터페이스를 구현하는 bimap 라이브러리(https://github.com/alethes/bimap)를 만들었습니다.종속성이 없으며 서버측에서 모두 사용할 수 있습니다(Node.js 에서는, 다음과 같이 인스톨 할 수 있습니다.npm install bimap
(lib/sysap.dlink에 링크함으로써) 및 브라우저에 접속합니다.
기본적인 조작은 매우 간단합니다.
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"
키와 값 매핑의 취득은 양방향으로 동일하게 고속입니다.후드 아래에 비용이 많이 드는 객체/어레이 트래버스가 없기 때문에 데이터 크기에 관계없이 평균 액세스 시간은 일정합니다.
오브젝트의 키/값을 얻을 수 있었습니다.
let obj = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'key4': 'value4'
}
Object.keys(obj).map(function(k){
console.log("key with value: "+k +" = "+obj[k])
})
다음 항목이 표시되지 않았습니다.
const obj = {
id: 1,
name: 'Den'
};
function getKeyByValue(obj, value) {
return Object.entries(obj).find(([, name]) => value === name);
}
const [ key ] = getKeyByValue(obj, 'Den');
console.log(key)
값은 고유하기 때문에 추가 키세트로 추가할 수 있습니다.이 작업은 다음과 같은 바로 가기를 사용하여 수행할 수 있습니다.
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)
이것은 Underscorejs 메서드의 작은 확장이며 대신 Lodash를 사용합니다.
var getKeyByValue = function(searchValue) {
return _.findKey(hash, function(hashValue) {
return searchValue === hashValue;
});
}
FindKey는 값과 일치하는 첫 번째 키를 검색하여 반환합니다.
대신 마지막 일치를 원할 경우 FindLastKey를 사용합니다.
ES6 방식:
Object.fromEntries(Object.entries(a).map(b => b.reverse()))['value_you_look_for']
여기에는 중첩된 객체가 아닌 플랫 키 => 가치 객체에 적합한 Lodash 솔루션이 있습니다.은 사용 권장 입니다._.findKey
는 중첩된 개체가 있는 개체에는 작동하지만 이 일반적인 상황에서는 작동하지 않습니다.
이 접근법에서는 개체를 반전하여 키를 값에 스왑한 다음 새(반전된) 개체에서 값을 조회하여 키를 찾습니다.수 키를 찾을 수 없습니다.false
나는 좋다.undefined
이 세는 쉽게 수 _.get
in the method in the method in 。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
오브젝트와 찾고 있는 키의 값이라는2개의 파라미터를 사용하는 findKey(array, value)를 간단하게 쓸 수 있습니다.따라서 이 메서드는 재사용이 가능하며 이 함수에 대해 2개의 파라미터만 전달하여 매번 개체를 수동으로 반복할 필요가 없습니다.
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;
}
또는 원하는 순서대로 키와 값을 사용하여 새 개체를 만든 다음 해당 개체를 조회합니다.상기 시제품 코드를 사용하여 문제가 발생하였습니다.키 주위에 String 함수를 사용할 필요가 없습니다.이것은 옵션입니다.
newLookUpObj = {};
$.each(oldLookUpObj,function(key,value){
newLookUpObj[value] = String(key);
});
저는 보통 밑줄보다는 lodash를 추천합니다.
있으면 쓰세요.
그렇지 않으면 lodash.invert npm 패키지를 사용하는 것을 고려해 주십시오.이것은 매우 작은 것입니다.
꿀꺽을 사용하여 테스트할 수 있는 방법은 다음과 같습니다.
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 패키지를 설치하고 꿀꺽 삼키다
$ 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
레퍼런스
https://www.npmjs.com/package/lodash.invert
https://github.com/gulpjs/gulp
마치 이 질문이 완전히 녹초가 되지 않은 것처럼...
여기 호기심이 어떤 걸 가져오든 간에...
객체에 문자열 값만 있는 것이 확실하다면 이 구현을 떠올리기 위해 많은 노력을 기울일 수 있습니다.
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]);
어쩌면 여기서 뭔가 유용한 걸 만들 수 있을지도 몰라
이게 널 즐겁게 해주길 바라.
밑줄 js 솔루션
let samplLst = [{id:1,title:Lorem},{id:2,title:Ipsum}]
let sampleKey = _.findLastIndex(samplLst,{_id:2});
//result would be 1
console.log(samplLst[sampleKey])
//output - {id:2,title:Ipsum}
배열 값을 가진 개체가 있는 경우.여기 좋은 예가 있다.예를 들어, 가지고 있는 파일의 확장자에 근거해 아이콘을 표시하고 싶다고 합니다.아이콘이 동일한 모든 확장자는 동일한 개체 값 아래에 있습니다.
주의: 케이스가 많은 스위치를 사용하는 것보다 이 케이스를 오브젝트로 랩하는 것이 좋습니다.
다음 코드 스니펫(es6에 기재)을 체크하고 특정 내선번호에 대한 특정 키를 반환하는 방법을 확인합니다.
이 git repo에서 확장자 목록을 받았습니다.
// Oject that contains different icons for different extentions
const icons = {
"music": ["mp3", "m4a", "ogg", "acc", "flac","m3u", "wav"],
"video": ["mp4","webm", "mkv", "avi", "mov", "m4v", "mpeg"],
"image": ["jpg", "gif", "png", "jpeg", "tif", "psd", "raw", "ico"],
"archives": ["zip", "rar", "tar", "dmg", "jar"],
"3d-files": ["3ds", "dwg", "obj", "dae", "skp", "fbx"],
"text": ["doc", "rtf", "txt", "odt", "tex"],
"vector-graphics":["ai", "svg"],
"pdf": ["pdf"],
"data": ["xml", "csv", "xls"]
}
const get_icon_Key =( icons_object,file_extention) => {
// For each key we chack if the value is contained in the list of values
let key = Object.keys(icons_object).find(
k=> icons[k].find(
// At this leve we check if the extention exist in the array of the specific object value ie. 'music', 'video' ...
icons_ext => icons_ext === file_extention)
// if we find it means this is the key we are looking for
? true: false);
return key
}
console.log(`The icon of for mp3 extention is: => ${get_icon_Key(icons,"mp3")}`)
console.log(`The icon of for mp4 extention is: => ${get_icon_Key(icons,"mp4")}`)
정말 직설적이다.
const CryptoEnum = Object.freeze({
"Bitcoin": 0, "Ethereum": 1,
"Filecoin": 2, "Monero": 3,
"EOS": 4, "Cardano": 5,
"NEO": 6, "Dash": 7,
"Zcash": 8, "Decred": 9
});
Object.entries(CryptoEnum)[0][0]
// output => "Bitcoin"
늦었지만 오늘 제가 만든 EMCMAScript 2017 솔루션에 대해 어떻게 생각하십니까?두 키의 값이 같으면 어떻게 됩니까?이게 제가 이 작은 조각을 만든 이유입니다.
일치하는 항목이 하나 있으면 문자열만 반환되지만 일치하는 항목이 여러 개 있으면 배열이 반환됩니다.
let object = { nine_eleven_was_a_inside_job: false, javascript_isnt_useful: false }
// Complex, dirty but useful. Handle mutiple matchs which is the main difficulty.
Object.prototype.getKeyByValue = function (val) {
let array = [];
let array2 = [];
// Get all the key in the object.
for(const [key] of Object.entries(this)) {
if (this[key] == val) {
// Putting them in the 1st array.
array.push(key)
}
}
// List all the value of the 1st array.
for(key of array) {
// "If one of the key in the array is equal to the value passed in the function (val), it means that 'val' correspond to it."
if(this[key] == val) {
// Push all the matchs.
array2.push(key);
}
}
// Check the lenght of the array.
if (array2.length < 2) {
// If it's under 2, only return the single value but not in the array.
return array2[0];
} else {
// If it's above or equal to 2, return the entire array.
return array2;
}
}
/*
Basic way to do it wich doesn't handle multiple matchs.
let getKeyByValue = function (object, val) {
for(const [key, content] of Object.entries(object)) {
if (object[key] === val) {
return key
}
}
}
*/
console.log(object.getKeyByValue(false))
심플하게!
Javascript에는 Object.values라는 함수가 내장되어 있어 정교한 메서드나 libs를 통해 객체를 필터링할 필요가 없습니다.
예제:
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
언급URL : https://stackoverflow.com/questions/9907419/how-to-get-a-key-in-a-javascript-object-by-its-value
'source' 카테고리의 다른 글
C에서의 MariaDB 사용 (0) | 2022.10.25 |
---|---|
iframe에 자동 재생 YouTube 비디오를 삽입하려면 어떻게 해야 합니까? (0) | 2022.10.25 |
필드 수가 1개보다 큰 경우 선택 (0) | 2022.10.25 |
LEFT OUTER JOIN과 LEFT JOIN의 차이점 (0) | 2022.10.25 |
생성된 열이 있는 테이블을 생성하면 오류가 발생합니다. (0) | 2022.10.25 |