매우 간단한 JavaScript 객체가 있는데 연관 배열로 사용합니다. 값의 키를 얻을 수있는 간단한 기능이 있습니까? 아니면 객체를 반복하고 수동으로 찾아야합니까?
var o = []; var map = {first: o, second: o}
. 무엇이 find_key(o)
돌아 올까요?
매우 간단한 JavaScript 객체가 있는데 연관 배열로 사용합니다. 값의 키를 얻을 수있는 간단한 기능이 있습니까? 아니면 객체를 반복하고 수동으로 찾아야합니까?
var o = []; var map = {first: o, second: o}
. 무엇이 find_key(o)
돌아 올까요?
답변:
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 업데이트
6 년이 지났지 만 여전히 투표권을 얻었으므로 현대 브라우저 / 환경을위한보다 현대적인 솔루션처럼 의견 자체가 아니라 답변 자체에서 언급해야합니다.
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);
ES6 + 원 라이너
let key = Object.keys(obj).find(k=>obj[k]===value);
값이있는 모든 키를 반환하십시오.
let keys = Object.keys(obj).filter(k=>obj[k]===value);
이 기능을 사용합니다 :
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'
강력하고 유연하며 효율적인 JavaScript 양방향 맵 인터페이스를 구현하는 Bimap 라이브러리 ( https://github.com/alethes/bimap )를 만들었습니다 . 종속성이 없으며 서버 측 (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;
}
또는 더 쉬운 방법-원하는 순서대로 키와 값을 사용하여 새 객체를 만든 다음 해당 객체를 찾아보십시오. 위의 프로토 타입 코드를 사용하여 충돌이있었습니다. 키 주위에 문자열 기능을 사용할 필요는 없습니다. 선택 사항입니다.
newLookUpObj = {};
$.each(oldLookUpObj,function(key,value){
newLookUpObj[value] = String(key);
});
이것은 Underscorejs 메소드의 작은 확장 이며 대신 Lodash를 사용합니다.
var getKeyByValue = function(searchValue) {
return _.findKey(hash, function(hashValue) {
return searchValue === hashValue;
});
}
FindKey 는값과 일치하는 첫 번째 키 를 검색하여 반환합니다 .
대신 마지막 일치를 원하면 FindLastKey를 대신 사용하십시오.
호기심을 불러 일으키는 방법은 다음과 같습니다.
객체에 문자열 값만 있다고 확신한다면 실제로이 구현을 활용하기 위해 자신을 소진시킬 수 있습니다.
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 패키지 및 꿀꺽 꿀꺽 설치
$ 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
참고 문헌
간단하게 유지하십시오!
정교한 메소드 나 라이브러리를 통해 객체를 필터링 할 필요가 없습니다. 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