source

JavaScript 객체의 키를 값으로 가져오려면 어떻게 해야 합니까?

manysource 2022. 10. 25. 17:56

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개의 파라미터만 전달하여 매번 개체를 수동으로 반복할 필요가 없습니다.

http://jsfiddle.net/rTazZ/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://lodash.com/

lodash와 언더스코어의 차이점

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