#javascript #json
#javascript #json
Вопрос:
как я могу получить ключ по значению?
это мой код.
function getkey(obj, key) {
for (i = 0; i < obj.length; i ) {
if (obj[i] === key) {
return obj[i];
}
}
}
var json = {
test: {
"key1": {
"inkey1": "value1",
"inkey2": "value2"
},
"key2": {
"inkey3": "value3",
"inkey4": "value4"
}
}
}
console.log(getkey(json, "value2"));
я хочу получить ключ1 по значению2
как я могу получить ключ1?
пожалуйста, помогите мне!
Комментарии:
1. Каков ваш ожидаемый результат?
2. Я имею в виду то, что вы хотите в качестве вывода?
Ответ №1:
Есть много способов сделать это, один из способов — использовать вариацию вашей функции и применить рекурсию. Смотрите фрагмент кода ниже:
function getkey(obj, key) {
for (i = 0; i < Object.keys(obj).length; i ) {
if (Object.values(obj)[i] === key) {
return Object.keys(obj)[i];
}
if (Object.values(obj)[i].constructor == Object) {
return getkey(Object.values(obj)[i], key)
}
}
}
var json = {
test: {
"key1": {
"inkey1": "value1",
"inkey2": "value2"
},
"key2": {
"inkey3": "value3",
"inkey4": "value4"
}
}
}
console.log(getkey(json, "value2"));
Приводит к inkey2
. Это должно работать независимо от того, насколько глубоко вложен ключ в ваш объект.
Ответ №2:
Для не вложенной версии
function getKeyByValue(obj, value) {
for (let key in obj) {
for (let inkey in obj[key]) {
if (obj[key][inkey] === value) {
return key;
}
}
}
}
console.log(getKeyByValue(json['test'], "value2")); //key1
Для вложенной версии, в которой вы не знаете, насколько глубок ваш объект
function getKeyByValue(obj, value, path) {
path = path ? path '.' : '';
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] === value) {
return path key;
} else if (typeof obj[key] === 'object') {
let found = getKeyByValue(obj[key], value, path key);
if (found) {
return found;
}
}
}
}
}
console.log(getKeyByValue(json, "value2")); //"test.key1.inkey2"
Комментарии:
1. @DaemonWarrior Если вы укажете console.log(getKeyByValue(json[‘test’], «value2»)); он вернет ключ1
2. могу ли я также получить значение1 по ключу1?
3. @DaemonWarrior да, вы можете